2010-10-26 25 views
5

मैंने यह जांचने के लिए एक कार्यक्रम लिखा है कि कागज पर समाधान के बारे में मेरा विचार सही है (और यह है)।इस पायथन कोड को सरल बनाएं

कार्य: कितने शून्य 200

यह 48 है 10 से सभी नंबरों के गुणन की पीठ में है और यह एक सरल मैन्युअल गणना करने के लिए है।

मैं गंभीरता से अजगर पर कभी नहीं लिख सकते हैं और यह मैं क्या मिलता है:

mul = 1 
for i in range(10, 200 + 1): 
    mul *= i 

string = str(mul) 
string = string[::-1] 
count = 0; 
for c in str(string): 
    if c == '0': 
     count += 1 
    else: 
     break 

print count 
print mul 

मुझे यकीन है कि यह एक अजगर की तरह इस तरह के भाषा में ही अधिक सुरुचिपूर्ण लिखने के लिए संभव है।

पुनश्च: हाँ, यह एक होमवर्क है, लेकिन मेरा नहीं - तिहाई है कि सभी अनुगामी शून्य का एक इटरेटर हो जाता है मैं सिर्फ एक आदमी ;-)

उत्तर

11

एक सीधी-सपाट कार्यान्वयन कि भाज्य की गणना (इतना है कि यह काम करता है को शामिल नहीं करता हैं ! बड़ी संख्या, यानी 2000000) (संपादित) साथ:

fives = 0 
twos = 0 
for i in range(10, 201): 
    while i % 5 == 0: 
     fives = fives + 1 
     i /= 5 
    while i % 2 == 0: 
     twos = twos + 1 
     i /= 2 
print(min(fives, twos)) 
+0

अच्छा होगा अगर मैं यह समझ सकूं कि यह कैसे काम करता है। –

+3

यह फैक्टोरियल के प्राइम फैक्टरलाइजेशन में फिव्स और जुड़वां की संख्या की गणना करता है (इसलिए 10! 2 फिव्स और 8 जुड़वां होंगे)। 5 * 2 = 10 के बाद से, और अन्य प्राइम संख्याओं को 10 तक गुणा नहीं किया जा सकता है, कारक बनाने में 10 की संख्या (जो पिछली ज़ीरो की संख्या है) न्यूनतम संख्या में मछलियों की संख्या और प्रधानों की संख्या में सबसे कम संख्या है गुणन। फिव्स और जुड़वां की संख्या गणना की गई फैक्टोरियल की तुलना में बहुत छोटी है। – irrelephant

+3

हालांकि सवाल 10-200 के लिए कॉल करता है, यह निश्चित रूप से बहुत बड़ी संख्या के लिए एक बेहतर दृष्टिकोण है। छोटी संख्याओं के लिए, वास्तव में गुणा करने से बाहरी तेजी से हो जाते हैं (कम से कम जब मैंने टाइमिट परीक्षण चलाया)। – snapshoe

3
import itertools 
mul = reduce(lambda x,y: x*y, range(10, 200+1)) 
zeros = itertools.takewhile(lambda s: s == "0", reversed(str(mul))) 
print len(list(zeros)) 

दूसरी पंक्ति उत्पाद की गणना करता है में मदद की, संख्या, आखिरी प्रिंट उस शून्य की संख्या प्रिंट करता है।

+2

'की जगह किया जा सका लैम्ब्डा एक्स, वाई: x * y' साथ' operator.mul' –

+0

और 'range' साथ' xrange' (हालांकि यह इस मामले में मामूली होगा) –

+0

@ ब्रेंडन लांग: चूंकि हम अलवा ys शुरू से लेकर सीमा के अंत तक फिर से शुरू होता है - क्या एक ओवरहेड 'xrange' नहीं है? – zerkms

3
len(re.search('0*$', str(reduce(lambda x, y: x*y, range(10, 200 + 1),1))).group(0)) 
+4

कुछ बदसूरत अजगर ... –

+1

लेकिन सुंदर है कि यदि आप कार्यात्मक में हैं प्रोग्रामिंग, दर्शक और सभी की आंख! –

+3

मैं नहीं कहूंगा कि यह बहुत कार्यात्मक है। आप कार्यात्मक प्रोग्रामिंग में बहुत से नियमित अभिव्यक्तियों को नहीं देखते हैं। –

6
import math 

answer = str(math.factorial(200)/math.factorial(9)) 
count = len(answer) - len(answer.rstrip('0')) 
  1. आयात गणित पुस्तकालय
  2. 200 की factorial की गणना करें और दूर पहले 9 संख्या
  3. पट्टी सही से शून्य दूर ले और लंबाई में अंतर का पता लगाने के
+0

सबसे इस पल – zerkms

+0

पर संक्षिप्त नहीं '(, operator.mul, xrange (10 200 + 1)) को कम करेगा' factorials + विभाजन से अधिक कुशल हो सकता है? –

+0

@Brendan लांग: सभी प्रश्नों के उत्तर की सराहना कर रहे हैं, लेकिन मैं निश्चित रूप से सबसे सुंदर एक ;-P – zerkms

0
mul = str(reduce(lambda x,y: x*y, xrange(10, 201))) 
count = len(mul) - len(mul.rstrip("0")) 
2

क्या आपका मतलब शून्य है? अन्यथा शून्य क्या है?

क्या कुछ गणित इसे आसान नहीं बनाते?

200 में कितने 5s लेन है ([x रेंज में एक्स (5, 201 के लिए, 5)]) = 40

200 में कितने 25s लेन है ([रेंज में एक्स के लिए एक्स (25, 201, 5) यदि x% 25 == 0]) = 8

200 में कितने 125s लेन हैं (x x x x (x, 125, 5) x x 125 == 0] = = 1

कुल 5s = 49

200! = 5^49 * 2^49 * (अन्य या संख्या विभाज्य 2 से नहीं 5)

तो वहाँ 49 शून्यों

+0

स्पष्ट होने के लिए - यह 48 है, न कि 49 ;-) और मैंने इसे मैन्युअल रूप से उसी तरह हल किया। वर्तमान प्रश्न सिर्फ पाइथन में "ब्रूटफोर्स" algorythm लिखने के बारे में एक जिज्ञासा है। – zerkms

+0

@zerkms: मैं अनुमान लगा रहा था कि आपने पहले से ही ऐसा किया होगा। मुझे मूर्ख! – pyfunc

4
print sum(1 + (not i%25) + (not i%125) for i in xrange(10,201,5)) 
संबंधित मुद्दे