当前位置: 代码迷 >> C语言 >> [求助]请问如何快速求得N!的最后一个非0数字
  详细解决方案

[求助]请问如何快速求得N!的最后一个非0数字

热度:49   发布时间:2007-08-16 01:12:46.0
[求助]请问如何快速求得N!的最后一个非0数字

N N!
0 1
1 1
2 2
3 6
4 24
5 120
10 3628800

如果要算9999!的最后一个非0数,有没好的算法

搜索更多相关的解决方案: 数字  算法  

----------------解决方案--------------------------------------------------------
O(n)和O(logn)两种方法,前者直接硬乘并取余数,后者用周期性来做
----------------解决方案--------------------------------------------------------
可否详细点说说周期怎么做.还有.楼上的.我注册了你的那个网站.那个交流群怎么进去?
----------------解决方案--------------------------------------------------------
这个题目我做过.
楼上利用周期性的LOG(n)不知道是怎么弄
我记得好像是第推n和n/5的末尾数字的关系也是个LOG(n);
----------------解决方案--------------------------------------------------------
以下是引用企鹅在2007-8-16 1:25:21的发言:
可否详细点说说周期怎么做.还有.楼上的.我注册了你的那个网站.那个交流群怎么进去?

你做出一个题(AC)就可以进了
----------------解决方案--------------------------------------------------------
“如果要算9999!的最后一个非0数,有没好的算法”这句话我没太看懂,你举个例子!

----------------解决方案--------------------------------------------------------

回复:(雨中飞燕)以下是引用企鹅在2007-8-16 1:25:2...

终于AC了一个 very easy 的题目
请问怎么进群啊


----------------解决方案--------------------------------------------------------

这道题目,重在分析。
要看9999!的最后一个非0数字。自要考查每一个乘数的最后一个非0数字。
那么从9999!=1*2*3*4*5*6*7*8*9*10*11*12*13*14*15……
可以得到所有乘数的最后一个非0数字为1*2*3*4*5*6*7*8*9*1*1*2*3*4*5……
显然是周期性数列!
那么不就好办啦?
只要知道1*2*3*4*5*6*7*8*9 = 326880 ,最后一个一个非0数字为8;
那么9999!中有1111组“1*2*3*4*5*6*7*8*9”。(注:1111组,明白的吧?)
那么9999!的最后一个非0数字就是8^1111的最后一个非0数字。

8^1111的最后一个非0数字,怎么算?
还是分析!
8^1111=2^3333=2*2*2*2*2…… 每乘2得到的结果末尾变化为:2,4,8,6,2,4,8,6,2……
还是周期数字吧 :2,4,8,6
3333%4 = 1,那么2^3333的最后一个数字为2.

要看9999!的最后一个非0数字就为2。

思路写成算法,时间复杂度是O(1);

[此贴子已经被作者于2007-8-16 10:35:26编辑过]


----------------解决方案--------------------------------------------------------
以下是引用devfhpgah在2007-8-16 4:34:48的发言:
“如果要算9999!的最后一个非0数,有没好的算法”这句话我没太看懂,你举个例子!

9999!末尾有
9999/5=1999...4
1999/5=399...4
399/5=79...4
79/5=15...4
15/5=3...0
3<5 End
0的个数等于1999+399+79+15+3=2495


----------------解决方案--------------------------------------------------------
以下是引用卧龙孔明在2007-8-16 10:23:32的发言:

9999!末尾有
9999/5=1999...4
1999/5=399...4
399/5=79...4
79/5=15...4
15/5=3...0
3<5 End
0的个数等于1999+399+79+15+3=2495

最后一个非0数!不是“0的个数”!


----------------解决方案--------------------------------------------------------

  相关解决方案