题解 P1134 【阶乘问题】

· · 题解

看到这道题一开始想就把ans每次*i然后取最右非零值一直保留个位去计算,但是发现只能过n最多为14的点

因为 14!最后两位为12,*15后应该得出结果8但是这样就是3了。

想了想,当i为2位数且为5的倍数时,ans的倒数第二位也会对结果造成影响,所以ans至少保留8位数字,因为最大的数为8位,所以每次ans%=10改成%=100000000就行了

目前没有找到这种方法不正确的地方

#include<cstdio>
#include<cstring>
int n;
long long ans;
int main()
{
    scanf("%d",&n);
    ans=1;
    for(int i=2;i<=n;i++)
    {
        ans*=1ll*i;//心理作用,实际并没有用
        while(ans%10==0) ans/=10;
        ans%=100000000;
    }
    printf("%lld\n",ans%10);
    return 0;
}