| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2198 人关注过本帖
标题:[原创]求n!的最后一位非零数,n
只看楼主 加入收藏
aaeehhhh
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2004-12-23
收藏
 问题点数:0 回复次数:12 
[原创]求n!的最后一位非零数,n

原题是这样的:
http://mcs.fjnu.edu.cn:8080/JudgeOnline/show?problem_id=1168

击鼓传花

Time Limit:10000MS Memory Limit:30000K

Total Submit:52 Accepted:2

--------------------------------------------------------------------------------

Description

HC(Happy Child)小朋友最近经常在教室里跟同学一起玩击鼓传花的游戏,规则是第n个拿到花的小朋友必须说出n!最后一位非0 的数字,如此循环游戏,如果谁讲错了就得罚唱一支歌曲。
经过几次游戏,HC小朋友认为只要把前一个小朋友说得数字去乘以n,说出得到的数的最后一位非0的数字就可以了,可惜HC小朋友这次轮到了第15个,结果被罚了唱歌(应该是8,但是HC小朋友却说了3)。
HC小朋友不希望这样的事情再次发生,所以希望你能编写一个程序,能够计算出n!的最后一位非0的数字。


Input

输入有5行,第I(1<=i<=5)行是一个n(1<=n<=10^100,10的100次幂)。


Output

输出有5行。
第I行对应输入中第I行的n的阶乘的最后一位非0的数字。


Sample Input


11
12
13
14
15
Sample Output


8
6
8
2
8

偶用的是pascal,编了好久才编出来的,10的100次方大约1秒以内把,但是那个judge坏掉了,又找不到其他的题库有这题,没法测试阿。。。哪位给测一下

我的程序如下

const
change:array[1..4,1..8] of longint=((1,2,1,4,1,6,1,8),(1,6,1,2,1,8,1,4),(1,8,1,6,1,4,1,2),(1,4,1,8,1,2,1,6));
type
stype=array[1..200] of longint;
var
dd,s,i,ws,ee,p:longint;
qq,pp,ls,n,m,q:stype;
st:string;
procedure fb;
var
i,j,k:longint;
begin
k:=0;
for i:=1 to 199 do begin
ls[i]:=ls[i]*2+k;
if ls[i]>10 then begin
k:=ls[i] div 10;
ls[i]:=ls[i] mod 10;
end
else k:=0;
end;
end;
function check0(x:stype):boolean;
var
i:longint;
begin
check0:=false;
for i:=1 to 200 do if x[i]<>0 then exit;
check0:=true;
end;
procedure cl(x:stype;y:longint);
var
j,l,k,i:longint;
e,n:stype;
begin
n:=x;
i:=y;
while not check0(n) do begin
ls:=n;
fb;
e:=ls;
if n[1]<5 then p:=n[1] else p:=n[1]-5;
if (e[2]=1)or(e[2]=3)or(e[2]=5)or(e[2]=7) then
case ws of
2:ws:=8;
8:ws:=2;
4:ws:=6;
6:ws:=4;
end;
if (p=2)or(p=3) then ws:=ws*3;
if p<3 then s:=p else s:=p-1;
while ws mod 10=0 do
ws:=ws div 10;
ws:=ws mod 10;
if s<>0 then
for j:=1 to s do
ws:=change[i,ws];
n:=ls;
for j:=1 to 199 do
n[j]:=n[j+1];
if p>=3 then inc(n[1]);
l:=1;
k:=0;
while n[l]+k>9 do begin
k:=(n[l]+k) div 10;
n[l]:=(n[l]+k) mod 10;
inc(l);
end;
n[l]:=n[l]+k;
inc(i);
if i>4 then i:=i-4;
end;
end;
procedure dcl(x:stype);
var
l,k,i,j:longint;
m,n:stype;
f:boolean;
begin
n:=x;
m:=n;
if n[1]<>0 then
for i:=1 to n[1] do
if i<>5 then
ws:=ws*i;
while ws mod 10=0 do
ws:=ws div 10;
ws:=ws mod 10;
f:=false;
if n[1]>4 then
f:=true;
for j:=1 to 199 do n[j]:=n[j+1];
if f then
n[1]:=n[1]+1;
l:=1;
k:=0;
while n[l]+k>9 do begin
k:=(n[l]+k) div 10;
n[l]:=(n[l]+k) mod 10;
inc(l);
end;
n[l]:=n[l]+k;
cl(n,2);
for j:=1 to 199 do
m[j]:=m[j+1];
qq:=m;pp:=n;
end;
begin
for dd:=1 to 5 do begin
fillchar(n,sizeof(n),0);
readln(st);
if st='1' then begin
writeln(1);
continue;
end;
for i:=length(st) downto 1 do
n[length(st)+1-i]:=ord(st[i])-48;
ws:=6;
qq:=n;
repeat
dcl(qq);
until check0(qq);
writeln(ws);
end;
end.

搜索更多相关主题的帖子: 零数 mcs Limit problem 
2006-08-10 09:49
aaeehhhh
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2004-12-23
收藏
得分:0 

有些小错,现已修正

const
change:array[1..4,1..8] of longint=((1,2,1,4,1,6,1,8),(1,6,1,2,1,8,1,4),(1,8,1,6,1,4,1,2),(1,4,1,8,1,2,1,6));
type
stype=array[1..200] of longint;
var
dd,s,i,ws,ee,p:longint;
qq,pp,ls,n,m,q:stype;
st:string;
procedure fb;
var
i,j,k:longint;
begin
k:=0;
for i:=1 to 199 do begin
ls[i]:=ls[i]*2+k;
if ls[i]>9 then begin
k:=ls[i] div 10;
ls[i]:=ls[i] mod 10;
end
else k:=0;
end;
end;
function check0(x:stype):boolean;
var
i:longint;
begin
check0:=false;
for i:=1 to 200 do if x[i]<>0 then exit;
check0:=true;
end;
procedure cl(x:stype;y:longint);
var
j,l,k,i:longint;
e,n:stype;
begin
n:=x;
i:=y;
while not check0(n) do begin
ls:=n;
fb;
e:=ls;
if n[1]<5 then p:=n[1] else p:=n[1]-5;
if (e[2]=1)or(e[2]=3)or(e[2]=5)or(e[2]=7) then
case ws of
2:ws:=8;
8:ws:=2;
4:ws:=6;
6:ws:=4;
end;
if (p=2)or(p=3) then ws:=ws*3;
if p<3 then s:=p else s:=p-1;
while ws mod 10=0 do
ws:=ws div 10;
ws:=ws mod 10;
if s<>0 then
for j:=1 to s do
ws:=change[i,ws];
n:=ls;
for j:=1 to 199 do
n[j]:=n[j+1];
if p>=3 then inc(n[1]);
l:=1;
k:=0;
while n[l]+k>9 do begin
k:=(n[l]+k) div 10;
n[l]:=(n[l]+k) mod 10;
inc(l);
end;
n[l]:=n[l]+k;
inc(i);
if i>4 then i:=i-4;
end;
end;
procedure dcl(x:stype);
var
ii,l,k,i,j:longint;
m,n:stype;
f:boolean;
begin
n:=x;
m:=n;
if n[1]<>0 then
for i:=1 to n[1] do
if i<>5 then
ws:=ws*i;
while ws mod 10=0 do
ws:=ws div 10;
ws:=ws mod 10;
f:=false;
if n[1]>4 then
f:=true;
for j:=1 to 199 do n[j]:=n[j+1];
if f then
n[1]:=n[1]+1;
l:=1;
k:=0;
while n[l]+k>9 do begin
ii:=(n[l]+k) div 10;
n[l]:=(n[l]+k) mod 10;
k:=ii;
inc(l);
end;
n[l]:=n[l]+k;
cl(n,2);
for j:=1 to 199 do
m[j]:=m[j+1];
qq:=m;pp:=n;
end;
begin
for dd:=1 to 5 do begin
fillchar(n,sizeof(n),0);
readln(st);
if st='1' then begin
writeln(1);
continue;
end;
for i:=length(st) downto 1 do
n[length(st)+1-i]:=ord(st[i])-48;
ws:=6;
qq:=n;
repeat
dcl(qq);
until check0(qq);
writeln(ws);
end;
end.

2006-08-10 19:59
偷着乐
Rank: 1
等 级:新手上路
帖 子:176
专家分:0
注 册:2006-8-16
收藏
得分:0 

楼主,把你的编程思想给大家分享一下吧....比如我就好迷糊哦:)


一切都是那么美好!比尼采还想象得深远!比幻觉还真实!
2006-08-18 14:01
aaeehhhh
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2004-12-23
收藏
得分:0 

想法。。。很难说阿,这个我只是想测试一下对不对。。。想法。。。10^100次方的阶乘那么大怎么做?自己想想吧。解题报告我自己都写不清楚。

2006-08-18 15:14
偷着乐
Rank: 1
等 级:新手上路
帖 子:176
专家分:0
注 册:2006-8-16
收藏
得分:0 

呵呵,是啊,可是你如果不算出来,如何测试你所用的算法能算出正确的结果呢?


一切都是那么美好!比尼采还想象得深远!比幻觉还真实!
2006-08-18 15:46
ligt0610
Rank: 1
等 级:新手上路
帖 子:204
专家分:5
注 册:2006-6-29
收藏
得分:0 
在乘的过程中,我们只需保留最后一位非零数。这位数在n>1时为偶数。当要乘的数中含有因数5时,
我们可以把所有的因数5都当作8来乘,因为:
...2*5=...10(舍)或...60,最后一位非零数为6。而恰好2*8=16,末位为6。
...4*5=...70(舍)或...20,最后一位非零数为2。而恰好4*8=32,末位为2。
...6*5=...30(舍)或...80,最后一位非零数为8。而恰好6*8=48,末位为8。
...8*5=...90(舍)或...40,最后一位非零数为4。而恰好8*8=64,末位为4。

通过不断的学习与思考才是提高自己能力的最好途径。。。。。。。
2006-08-21 12:58
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

有没有c的程序,或者解题思路(具体点的)啊?


2006-08-22 11:56
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

在乘的过程中,我们只需保留最后一位非零数。这位数在n>1时为偶数。当要乘的数中含有因数5时,
我们可以把所有的因数5都当作8来乘,因为:
...2*5=...10(舍)或...60,最后一位非零数为6。而恰好2*8=16,末位为6。
...4*5=...70(舍)或...20,最后一位非零数为2。而恰好4*8=32,末位为2。
...6*5=...30(舍)或...80,最后一位非零数为8。而恰好6*8=48,末位为8。
...8*5=...90(舍)或...40,最后一位非零数为4。而恰好8*8=64,末位为4。

正解

[此贴子已经被作者于2006-8-26 21:45:57编辑过]


2006-08-22 16:23
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

不过N<=10^100,太大了!怎么处理啊?

[此贴子已经被作者于2006-8-26 21:46:51编辑过]


2006-08-22 16:26
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

看看

[此贴子已经被作者于2006-8-26 21:48:45编辑过]


2006-08-22 16:31
快速回复:[原创]求n!的最后一位非零数,n
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014532 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved