/**
以下摘选自《编程之美》
问题描述:给定一个整数N,那么N的阶乘N!末尾有多少个0?如N=10 ,10!=3628800 N!末尾有2个0
首先考虑,如果N!=K*10^M,且K不能被10整除,那么N!末尾有M个0.再考虑对N!进行质因数分解,N!=(2^x)*(3^y)*(5^z)....,
由于10=2*5,所以M只和x和z有关,每一对2和5相乘可以得到一个10,于是M=min(x,z)不难看出x大于等于z
因为能被2整除的数出现的概率比能被5整除的数高的多,所以公式简化为M=z;
即z的值即为结果
解法一:
要计算z,最直接的方法,就是计算i(i=1,2,3...n)中因式分解中5的指数,然后求和
reg=0;
for(i=1;i<=N;i++){
j=i;
while(j%5==0){
reg++;
j/=5;
}
}
解法二:
公式Z=[N/5]+[N/5^2]+[N/5^3]+ .......(不用担心这会是一个无穷的运算,因为总存在一个K
,使得5^K>N,[N/5^k]=0)
公式中,[N/5]表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的倍数中5^2的倍数
再贡献一个5,代码:
reg=0;
while(N){
reg+=N/5;
N/=5;
}
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int reg=0;
while(n)
{
reg+=n/5;
n/=5;
}
printf("%d\n",reg);
}
1003

最新推荐文章于 2025-06-16 18:08:05 发布