题解 P1134 【阶乘问题】

· · 题解

看完下面的16篇题解,总觉得方法只有三种,只是有很多重复的题解.但实际此题只有一种正解.下面将三种方法都进行详细讲解.(其他的讲的较为模糊,估计他们自己都不清楚)

算法:

如果每次 mod 10,会造成误差.因为当相乘后得到的是10的倍数时,mod 10 会变成0.所以每次大概mod 1000000.最后输出ans%10

原理:最后一位相乘只会影响最后一位.故只保留最后几位就行了

#include <cstdio>
using namespace std;
int n,ans=1;
int a[4]= {6,8,4,2};
int main() {
    scanf("%d",&n);
    while (n>0) {
        for (int i=1; i<=n%10;++i)//除了5之外,其他数字原样乘.
        //n%10 的原因:答案只受末尾数字影响 
            if (i!=5) ans=ans*i%10;//跳过乘5(此时可以放心%10) 
        n=n/5;//n/5即少乘了多少次5
        //即乘8的次数 
        ans=ans*a[n%4]%10;//四次一循环(此时可以放心%10) 
    }
    printf("%d",ans);
    return 0;
}