【CodeVS2860】阶乘末尾的零

Description

100的阶乘1*2*3*...*100结果是个很大的数,求这么大的数末尾有多少个连续的零。

Input

含有一个正整数N (N不大于100000000)。

Output

仅一个整数,表示N!的末尾有多少个连续的零。

Sample Input

1000

Sample Output

249

题解

 根据算术基本定理(正整数唯一分解定理) N! = 2X * 3Y * 5* …

所有的0都是又2和5相乘得出的,而显然x>z,所以ans=z;

#include<iostream>
using namespace std;
int n,ans;
int main(){
    cin>>n;
     for (int i=5;i<=n;i+=5)
        for (int c=i;c%5==0&&c>0;c/=5)  ans++;
    cout<<ans;
}

写的时候犯了一个错误,for (;A,B;) 这样是条件A或条件B,而不是与。

进一步优化:z =  [N/5] +[N/52] +[N/53] + …

#include<iostream>
using namespace std;
int n,ans;
int main(){
    cin>>n;
     for (int i=5;i<=n;i*=5) ans+=n/i;
    cout<<ans;
}

维基百科 算术基本定理

posted @ 2016-03-06 21:42  mengyue  阅读(263)  评论(0编辑  收藏  举报