结果先行:1000的阶乘里有249个0
【思路】:
直接暴力计算肯定不行,要计算1000!中有几个0,其实很简单,只要计算1000!中有几个5就行,因为5和任意一个偶数相乘就能得到10,比如5*2=10,而1000的因数中偶数个数肯定大于5的个数,所以直接把问题转化称1000!的因数中有多少个5即可。
1000!又是1000999998*…32*1的结果,所以需要分两步走:
【步骤一】:计算某个数中有多少个5,如25
def count_factor_5(num):
'''
参数:num为要计算的数
返回值:返回num中有多少个5
'''
count = 0
while num%5 == 0:
num /= 5
count += 1
return count
【步骤二】:找出1000以内每个数中有多少个因数5,存入字典
此处用字典存储,不直接循环计数,循环太慢了
def count_zero(nums):
'''
参数:需要计算的数字,此处为1000
返回值:返回字典,键是1-1000,值是每个数字对应的因数5的个数
'''
cnt = {}
for num in range(1,nums+1):
# 为了美观和运算效率,只存储含有因数5的键值对
if count_factor_5(num)!=0:
cnt[num] = count_factor_5(num)
return cnt
【步骤三】:对字典的值求和
print('1000!里有{}个0'.format(sum(cnt.values())))
# 求1000!的阶乘里有几个0
# 步骤一:求某个数里有几个因子5
def count_factor_5(num):
'''
参数:num为要计算的数
返回值:返回num中有多少个5
'''
count = 0
while num%5 == 0:
num /= 5
count += 1
return (count)
# 找出1000以内每个数中有多少个因数5,存入字典
def count_zero(nums):
'''
参数:需要计算的数字,此处为1000
返回值:返回字典,键是1-1000,值是每个数字对应的因数5的个数
'''
cnt = {}
for num in range(1,nums+1):
if count_factor_5(num)!=0:
cnt[num] = count_factor_5(num)
return cnt
# 对字典的值求和
print('1000!里有{}个0'.format(sum(cnt.values())))