Simplify this python code
I've written a program to check if my thought about solution on paper is right (and it is).
The task: how many zeros is in the back of multiplication of all numbers from 10 to 200.
It is 48 开发者_StackOverflow社区and it is a simple to calculate manually.
I never write on python seriously and this is what I get:
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
I bet it is possible to write the same more elegant in such language like a python.
ps: yes, it is a homework, but not mine - i just helped a guy ;-)
A straight-forward implementation that doesn't involve calculating the factorial (so that it works with big numbers, ie 2000000!) (edited):
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))
import math
answer = str(math.factorial(200) / math.factorial(9))
count = len(answer) - len(answer.rstrip('0'))
- Import the math library
- Calculate the factorial of 200 and take away the first 9 numbers
- Strip away zeros from the right and find out the difference in lengths
print sum(1 + (not i%25) + (not i%125) for i in xrange(10,201,5))
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))
The second line calculates the product, the third gets an iterator of all trailing zeros in that number, the last prints the number of that zeros.
len(re.search('0*$', str(reduce(lambda x, y: x*y, range(10, 200 + 1),1))).group(0))
Do you mean zeroes? What is null otherwise?
Wouldn't some mathematics make it simpler?
How many 5s in 200 is len([x for x in range(5, 201, 5)]) = 40
How many 25s in 200 is len([x for x in range(25, 201, 5) if x%25 == 0]) = 8
How many 125s in 200 is len([x for x in range(120, 201, 5) if x%125 == 0]) = 1
Total 5s = 49
200! = 5^49 * 2 ^49 * (other numbers not divisible by 2 or 5)
So there are 49 zeroes
mul = str(reduce(lambda x,y: x*y, xrange(10, 201)))
count = len(mul) - len(mul.rstrip("0"))
精彩评论