代码之家  ›  专栏  ›  技术社区  ›  zerkms

简化这个python代码

  •  5
  • zerkms  · 技术社区  · 14 年前

    任务是:从10到200的所有数字相乘的后面有多少个零。

    我从来没有认真写过python,这就是我得到的:

    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
    

    附言:是的,这是一个家庭作业,但不是我的——我只是帮助了一个人;-)

    7 回复  |  直到 12 年前
        1
  •  11
  •   irrelephant    14 年前

    一个不需要计算阶乘的直接实现(这样它就可以处理大数,即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))
    
        2
  •  6
  •   Brian McKenna    14 年前
    import math
    
    answer = str(math.factorial(200) / math.factorial(9))
    count = len(answer) - len(answer.rstrip('0'))
    
    1. 导入数学库
    2. factorial 把前9个数字拿走
    3. 从右边去掉零,找出长度上的差异
        3
  •  4
  •   Robert William Hanks    14 年前
    print sum(1 + (not i%25) + (not i%125) for i in xrange(10,201,5))
    
        4
  •  3
  •   Kos    14 年前
    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))
    

    第二行计算乘积,第三行获取该数字中所有尾随零的迭代器,最后一行打印该零的数目。

        5
  •  3
  •   Lachezar    14 年前
    len(re.search('0*$', str(reduce(lambda x, y: x*y, range(10, 200 + 1),1))).group(0))
    
        6
  •  2
  •   pyfunc    14 年前

    一些数学难道不能使它更简单吗?

    200中有多少个25秒是len(如果x%25==0,则x代表x在范围(25,201,5)中的x))=8

    200中有多少个125s是len(如果x%125==0,则x代表x的范围(120201,5))=1

    200!=5^49*2^49*(其他数字不能被2或5整除)

    所以有49个零

        7
  •  0
  •   kindall    14 年前
    mul = str(reduce(lambda x,y: x*y, xrange(10, 201)))
    count = len(mul) - len(mul.rstrip("0"))