USACO-Factorials(阶乘最后一个非0数)

一开始想的是每乘一位取最后一位数。
然后发现一个反例 14!=87178291200 15!=1307674368000
215/10=3
因为当乘上一个5时,会使得原来的最后一位数变成0,而新的最后一位数是由原来最后一位数的进位和原来的倒数第二位的最后一位数决定的。所以不能用这种方法。

所以考虑先把所有的因子5提出来,然后与2抵消,最后乘法中就不会出现最后一位非0数被消掉的情况了。
如: 12345678910=11321678921010

/*
ID: xdujlx1
PROG: fact4
LANG: C++
*/
#include
using namespace std;
void ioinit()
{
    freopen("fact4.in","r",stdin);
    freopen("fact4.out","w",stdout);
}
int a[10007];
int main()
{
    ioinit();
    int n;
    cin>>n;
    int res=1;
    int cnt=0;
    for(int i=1;i<=n;i++) a[i]=i;
    for(int i=5;i<=n;i+=5)
    {
        while(a[i]%5==0)
        {
            a[i]/=5;
            cnt++;
        }
    }
    for(int i=2;i/2<=cnt;i+=2) a[i]/=2;
    for(int i=2;i<=n;i++)
    {
        res*=a[i];
        while(res%10==0) res/=10;
        res%=10;
    }
    cout << res << endl;
    return 0;
}

你可能感兴趣的:(数论)