参考:https://www.cnblogs.com/hutonm/p/5624996.html
问题描述:
给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。
计算公式:
f(x):表示整数阶乘末尾含有的0.
,k取整
问题分析:
然而构成0结尾的必然是因子5*因子2,在自然数序列中,含因子2的个数必然比含因子5的个数(如果你说1->1,3->3,这样举例就没法说了)。
根据上面我们知道,含有因子5的个数就对应后面0的个数,现在我们来计算因子5的个数
当n<5时,f(n!) = 0,成立
当n>=5时,我们令 n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),
,必然a是一个不含因子5的整数。化简上面的公式 n! = [ 5^k * k! ] * a ,因为我们计算的是末尾0,
所以f(n!) = k + f(k!) ,成立
扫描二维码关注公众号,回复:
3446932 查看本文章
举个例子:
f(5!) = 1 + f(1!) = 1;
f(10!) = 2 + f(2!) = 2;
f(100!) = 20 + f(20!) = 20 + 4 + f(4!) = 24;
f(1000!) = 200 + f(200!) = 200 + 40 + f(40!) = 200 + 40 + 8 + f(8!) = 200 + 40 + 8 + 1 + f(1!) = 249;
代码:
#include<bits/stdc++.h>
using namespace std;
int countZero(int x)
{
int res=0;
while(x>=5)
{
x/=5;
res+=x;
}
return res;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
printf("%d\n",countZero(n));
}
return 0;
}
例题:
链接:https://www.nowcoder.com/acm/contest/135/D
题目描述
输入描述:
输入数据共一行,一个正整数n,意义如“问题描述”。
输出描述:
输出一行描述答案: 一个正整数k,表示S的末尾有k个0
示例1
输入
10
输出
7
AC代码:
/*
思路:间隔5个循环,不会超时
*/
#include<bits/stdc++.h>
using namespace std;
long long countZero(long long x){
long long res=0;
while(x>=5){
x/=5;
res+=x;
}
return res;
}
int main(){
long long n;
scanf("%lld",&n);
long long x=n/5;
long long sum=0;
for(long long i=0;i<x;i++){
sum+=5*countZero(i*5);
}
sum+=((n%5)+1)*countZero(n);
printf("%lld\n",sum);
return 0;
}