To Luckyguy2008: 首先有一个结论,除了0、1的阶乘以外,大于1的数的阶乘的非零尾数肯定为偶数,而1、6乘以任何偶数,尾数都不变。所以尾数为1和6的数对阶乘的尾数无影响。 先以10的阶乘为例,10!=1*2*3*4*5*6*7*8*9*10,1以及3*7的尾数为1,2*8、4*9、以及6的尾数都为6,所以这些数的乘积为数肯定为6,而其不会影响10!阶乘的尾数,影响10!的尾数只跟5和10有关的倍数有关。 再看任意一个自然数的阶乘,比如123,由上面的结论,1~120的数中,以1、2、3、4、6、7、8、9结尾的数的乘积尾数为6,且不影响最终的尾数。所以123!的非零尾数只与5、10、15、120以及最后的3!(121、122、123)有关。 因为6^n*123!不会影响非零尾数。所以 非零尾数(123!)=非零尾数(5*6*10*6*15*6...*120*6*3!)=非零尾数(30*60*90*...*720*3!)=非零尾数(3!*3^24*24!) 而3^n的尾数,是1、3、9、7的循环,所以由此可以判断24除4余多少来判断3^246的尾数。 所以可以推导出对于任意数N,非0尾数(N!)=非0尾数(mod(n,10)!*3^int(N/5)*int(N/5)!),如果N的各位大于5,前面int(N/5)!已经把最后一个5算过一遍了,所以在mod(n,10)大于4的情况下可以再除一个5。 经上面分析可以看出,可以用递归来计算。 先定义好2个数组,Data1(0 to 9)=(1,1,2,6,4,4,4,8,4,6)分别代表0~9的尾数的阶乘的尾数,5以上的除了 个5,Data2(0 to 3)=(1,3,9,7)为3^N的尾数。 这样,自定义函数如下: Public Function NLast(ByVal n) If n > 4 Then NLast = Data1(Right(n, 1)) * Data2(Right(Int(n / 5), 2) Mod 4) * NLast(Int(n / 5)) Mod 10 Else NLast = Data1(n) End If ---------------- 分析得太精彩了,学习 |