原题是这样的:
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.