给个想法,没有具体实现,应该可以解决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的幂的数
当然如果超出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的幂的数