洛谷 P1134 [USACO3.2]阶乘问题

题意

也就是字面上的意思,求出N!阶乘的最右边的非零位的值。

做法

用模拟加数论的方法,因为想要在末尾出现一个0,那么就一定会是10的倍数,而10=2*5,所以只要看1~N中出现5的次数即可,因为2的倍数的数量一定是比5的倍数的数量多的。然后在循换中每次mod10求个位数,因为任何正整数相乘的个位数只与它们的个位数有关。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int k;
int main()
{
    //freopen("fact4.in","r",stdin);
    //freopen("fact4.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        int s=i;
        while(s%5==0)
        {
            s/=5;
            k++;
        }//记录5的倍数出现的次数(指的是这个数有多少个5相乘) 
    }
    int sum=1;
    for(int i=1;i<=n;++i)
    {
        int p=i;
        if(p%2==0&&k)
        {
            p/=2;
            --k;
        }//将2的倍数找到除以2,减少次数 
        while(p%5==0)
           p/=5;
        sum*=p;
        sum%=10;//每次%10找个位数 
    }
    printf("%d\n",sum);
    return 0; 
}   

 

posted @ 2022-02-12 16:15  LikC1606  阅读(141)  评论(0)    收藏  举报