问题分析:对于N!,想要知道其末尾有多少个0,则可以分解为问题能被多少个10整除,继续分解,被10整除,则必能同时被2和5整除。则对N!进行质因数分解,N!=(2^x)*(3^y)*(5^z)*...,可得N!=2^p*5^q+r,1<p<x,1<q<z,因为每一对2*5可以得到10,即1个0,则一共有多少对2*5要看min(x,z)的大小,则令A=min(x,z);显而易见x>z
一:则M=1+2+...+k,存在一个k使得5*k<=N!
二:则M=N!/5+N!/5^2+...N!/5^k,存在一个k,使得N!/5^(k+1)=0,5^k<=N!,5^(k+1)>N!
代码如下:
View Code
#include<iostream> using namespace std; int num_nFun(int n) { int sum = 0; while(n) { sum += n/5; n /= 5; } return sum; } int num_nFun1(int n) { int sum = 0; for(int i = 1; i <= n; i++) { int num = i; //int count = sum; while(num % 5 == 0) { sum++; //cout<<num<<":"<<sum-count<<endl; num /= 5; } } return sum; } int main() { int n; cin>>n; cout<<num_nFun(n)<<endl; cout<<num_nFun1(n)<<endl; return 0; }