题解 P1134 【阶乘问题】

· · 题解

这道题,暴力可以过。

暴力方法:暴力乘,每次保留得到的数的后6~7位左右(保证不出现误差)留太多位会时超。如果每次 mod 10,会造成误差.因为当相乘后得到的是10的倍数时,mod 10 会变成0.所以每次大概mod 100000或10000000.最后输出ans%10

原理:最后一位相乘只会影响最后一位.故只保留最后6~7位就行了 废话不说上代码。

var
    n,i:longint;
    ans:qword;//答案
function lastdigit(v:qword):qword;
    begin
        while v mod 10=0 do v:=v div 10;//求最后的6位非0数
        lastdigit:=v mod 1000000;//答案
    end;
begin
    readln(n);//读入n
    ans:=1;//初始化,ans不能是0
    for i:=2 to n do
        ans:=lastdigit(i*ans);//ans每次都乘i
    writeln(ans mod 10);//直接摸到0就好,不用担心ans mod 10会是0;
end.