题目描述
编程输入n(n<=100000),求n的阶乘值(n!)尾部有多少个连续的0。
输入
一个整数n.
输出
一个整数
样例
输入
10
输出
2
参考代码:
第一次代码,在编译器运行没任何问题,但是在OJ平台报错,显示运行时间超过限制
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,count=0;
long long num=1;
cin>>n;
for(int i=2;i<=n;i++)
num *=i;
while(num%10==0)
{
count++;
num /=10;
}
cout<<count;
return 0;
}
继续修改优化代码中……还是存在问题,OJ报错,只通过25%测试
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,count=0;
long long num=1;
cin>>n;
for(int i=2;i<=n;i++)
num *=i;
// string strNum=format("{}", num);
stringstream ss;
ss << num;
string strNum = ss.str();
for(int j=strNum.length()-1;j>=0;j--)
{
if(strNum[j]=='0')
{
count++;
}
else break;
}
cout<<count;
return 0;
}
最后才发现题目里数据范围很大,最大是10000,阶乘数已经超过long long的数据范围了,所以解题思路从一开始就是错误。
下面是一个超级详细的分析博客连接:C\C++求N的阶乘!的值中末尾0的个数实践小记_c\c++求n的阶乘!的值中末尾0的个数实践小记-CSDN博客
最后代码:(成功通过OJ测试)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N;
int sum = 0;
scanf("%d", &N); // 输入N
for(int i = 1; i <= N; i++)
{
int j = i;
while(0 == j % 5)
{
sum++; // 统计公约数5出现的频次
j /= 5;
}
}
cout<<sum;
return 0;
}