题目描述
给定一个整数N,那么N的阶乘N!末尾有多少个0呢?(该题取自《编程之美》)
分析求解
int numOfzero(int N)
{
int cnt = 0;
for (int i=1; i<=N; i++) {
int j = i;
while (j % 5 == 0) {
cnt++;
j /= 5;
}
}
return cnt;
}
继续分析可以改进上面的代码,为求出1到N的因式分解中有多少个5,令Z=N/5 + N/(5^2) + N/(5^3)+...即N/5表示1到N的数中5的倍数贡献一个5,N/(5^2)表示5^2的倍数再贡献一个5...举个简单的例子,比如求1到100的数因式分解中有多少个5,可以知道5的倍数有20个,25的倍数有4个,所以一共有24个5。代码如下:
int numOfzero2(int N)
{
int cnt = 0;
while (N) {
cnt += N/5;
N /= 5;
}
return cnt;
}
存在性
使用反证法来证明,假设存在大于1的自然数不能写成质数的乘积,把最小的那个称为n。自然数可以根据其可除性(是否能表示成两个不是自身的自然数的乘积)分成3类:质数、合数和1。首先,按照定义,n 大于1。其次,n 不是质数,因为质数p可以写成质数乘积:p=p,这与假设不相符合。因此n只能是合数,但每个合数都可以分解成两个严格小于自身而大于1的自然数的积。设 n = a*b,a和b都是大于1小于n的数,由假设可知,a和b都可以分解为质数的乘积,因此n也可以分解为质数的乘积,所以这与假设矛盾。由此证明所有大于1的自然数都能分解为质数的乘积。
唯一性
当n=1的时候,确实只有一种分解。假设对于自然数n>1,存在两种因式分解:n=p1...pm = q1...qk,p1<=...<=pm, q1<=...<=qk。其中p和q都是质数。我们要证明p1=q1...如果不相等,我们可以设p1<q1,从而p1小于所有的q,由于p1和q1是质数,所以它们的最大公约数为1,由欧几里德算法可知存在整数a和b使得a*p1 + b*q1 = 1。因此
a*p1*q2...qk + b*q1*q2...qk = q2...qk. 由于q1...qk = n,因此p1除尽右边的q2...qk,即q2...qk / q1为整数,且q2...qk有一个质数因子分解,在此因式分解中p1出现,但是q2...qk < n,所以它有一个唯一的因式分解(由归纳法),此矛盾表明,p1最终一定等于q1,所以p1能够除尽两个n的因子分解p1...pm和q1...qk,从而p2...pm = q2...qk < n,另一个因子也相等(由归纳法)。由此完成唯一性的证明。
参考资料
编程之美
具体数学