1003

来源:互联网 发布:linux怎么安装vmtools 编辑:程序博客网 时间:2024/05/22 08:08
/**以下摘选自《编程之美》 问题描述:给定一个整数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);} 

原创粉丝点击