【CodeVS2860】阶乘末尾的零
Description
100的阶乘1*2*3*...*100结果是个很大的数,求这么大的数末尾有多少个连续的零。
Input
含有一个正整数N (N不大于100000000)。
Output
仅一个整数,表示N!的末尾有多少个连续的零。
Sample Input
1000
Sample Output
249
题解
根据算术基本定理(正整数唯一分解定理) N! = 2X * 3Y * 5Z * …
所有的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; }