题目概述
给出n,求n!最右边第一位的非0数。
解题思路
对于一个数的阶乘,末尾的0只会以2*5的形式产生。而1到n中因数2的数量远远大于5,因此我们可以通过找因数5的方式来滤掉末尾的0;
这里还有另一个规律:除去0!和1!,本题的答案只可能是2,4,6,8。这4个数乘上末位是6的数,结果还是自己,因此可以将这种情况省略。
时间复杂度:O(n)
空间复杂度:O(1)
源程序
vari,n,t:longint;
ans:int64;
begin
read(n);
ans:=1;
for i:=2 to n do
begin
if i mod 10=6 then continue;
t:=i;
while t mod 5=0 do
begin
t:=t div 5;
ans:=ans shr 1;
end;
ans:=ans*t;
if ans>100000000000 then ans:=ans mod 100000000000;
end;
write(ans mod 10);
end.