为了账号安全,请及时绑定邮箱和手机立即绑定

小朋友学数学(23):求2000!末尾有多少个0

标签:
C++

一、思路

一个数末尾的0是由2和5乘出来的,而1到2000里2多得是,主要看1到2000中有多少个5或5的n次方的倍数。
(1)统计5的倍数
2000/5=400,比如5、10、15、20、25等等。这些数,要么直接含了0,要么与2的倍数相乘会得到0,所以共有400个0。
(2)统计25的倍数
2000/25=80,比如25、50、75等等,这些数与4或4的倍数相乘,会得到两个0,但因为上一步中经加过一次0了,所以这里只能加80个0,而不是80 * 2 = 160个0。
(3)统计125的倍数:
2000/125=16,比如125、250、375等等,这些数与8或8的倍数相乘,会得到3个0。但是因为前两步算过两次了,这里只能再加一次。所以会增加16个0,而不是16 * 3 = 48个0。
(4)统计625的倍数
2000/625=3。这三个数分别数是625,1250和1875。这些数与16或16的倍数相乘,会得到4个0。但是前面已经计算过3次了,所以只会增加3个0,而不是3 * 4 = 12个 0。
(5)最后结果:400+80+16+3 = 499

二、编程实现

(一)用C++实现

考虑到2000!的阶乘是个很大的数,C++中的long long型变量存放不下,只能考虑用数组实现。但是数组实现会比较烦琐。若结合上面的数学思路,可以直接写出代码:

#include <iostream>using namespace std;int main(){    cout << 499 << endl;    return 0;
}

(二)用Python实现

在Python中,有一种bignum的数据类型,可以存放很大的数。当数很大时,将自动使用bignum类型。

product = 1
count = 0for i in range(1, 2001):
    product *= i
    
strPro = str(product)for i in range(len(strPro) - 1, 0, -1):    if '0' == strPro[i]:
        count += 1    else:        breakprint(count)



作者:海天一树X
链接:https://www.jianshu.com/p/aa109b730b5e


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消