计算n!的最后一位非零数字的算法

 给个想法,没有具体实现,应该可以解决1M位以内的阶乘的最后非零数字问题。
当然如果超出long long的话需要用大整数的运算。

大体思想:
从n的最低位到最高位依此计算出最后一个非零数字在第k位的所有在1。。n范围内的数字所提供的2,3,7,9的个数,然后计算出总的2,3,7,9的个数,利用单个数字相乘最后一位数字的循还性,计算出n!的最后一位非零数字。

具体想法如下:

1.对于n!,考虑每个数最后一位非零的数子,然后统计从1到n提供了多少个2。。9(0,5先都不考虑,1不用考虑),从最后一位开始考虑.
对于提供了m个数字d(从1到9)有规律如下,假设对于2,2 * 2 = 4, 2 * 4 = 8 ,2 * 8 = 16,2 * 6 = 12 如此循环,所以对于2来说它的周期为4,也就是对于m个2它所提供的最后一位数字为m % 4所对应的6,2,4,8,对于为偶数的数字,都把其拆分成2和非偶数的乘积,例如对于m个6,则添加m个2和m个3,而m个8则只添加3m个2。

2.下面讨论5的问题,对于5来说,它必然会与一个2相乘而得到0,所以先要求出从1。。n提供了多少个5,注意对于5^x提供了x个5,然后减去相应个数的2(2一定比5多,由第一步保证)。

3.下面在考虑包含5的数提供的最后非零数字是什么,举例如下对于末两位为05,15,35,45,55,65,75,85,95并且非5的幂的数
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值