codeup27952 阶乘尾连续0
时空限制 1000ms/16MB
题目描述
n的阶乘(n!)尾部有多少个连续的0。
输入
一个正整数n(0<=n<=100000)。
输出
一个整数。
样例输入
12
样例输出
2
分析
如果学了高精度,就可以把阶乘求出来,再算出最后连续0,就可以AC了。但是没有学习高精度怎么办,把n的阶乘求出来吗?不要忘了int 范围,long long 范围,肯定存不下。
思路:要想得到0,必须是2×5。以100!=1×2×3.....99×100 为例,每个因子分解的到的2的个数一定比5多(为何?自己想),那么答案就和100的因子有多少个5一样了。
代码里第一个循环就是枚举n!的每个乘数;第二个循环,就是统计每个乘数提供5的个数。比如100!在×99时,99%5!=0,所以提供5的个数为0,×100时,100%5==0,ans++,因子变为20,20%5==0,再一次ans++,因子变为4,4%5!=0,第二个循环结束,ans加了2次,提供了2个5(100=5×5×2×2)。
代码
法一:两层循环
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
for (int i=5; i<=n; i+=5)
for (int j=i; j%5==0; j/=5)
ans++;
cout<<ans<<endl;
return 0;
}
法二:单层循环
#include<iostream>
using namespace std;
int main(){
int n,ans=0;
cin>>n;
while (n>0){
ans += n/5;
n /= 5;
}
cout<<ans<<endl;
return 0;
}