题目描述:
输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 。
解题思路:
对于这样的问题,我们可以换个思维方式,它要求0的个数,那么0是怎么来的?
是不是一对2*5得到的0,所以我们可以分解这个问题分,把他看作是求整数n分解质因数后,一共有多少组min(2,5),在当然2的个数肯定比5多,所以我们继续往下拆解,可以看做是求n中有多少个5!!!
在n这个数中,每隔5个就会分解产生一个0,如:5,10,15,20….
每隔5*5个就会多分解产生一个5,如:25,50,75…..
再阁5*5*5就又多一个5…
废话少说上代码
#include <stdio.h>
int CountZero(int n)
{
int count = 0;
while(n)
{
count = count+n/5;
n /= 5;
}
return count;
}
int main()
{
int n;
scanf("%d\n",&n);
int ret = CountZero(n);
printf("%d\n",ret);
return 0;
}
另外
可扩展到:n!的二进制表示中最低位1中的位置。相当于求质因数的2的个数
原理是:
假如你把1 × 2 ×3× 4 ×……×N中每一个因数分解质因数,结果就像:
1 × 2 × 3 × (2 × 2) × 5 × (2 × 3) × 7 × (2 × 2 ×2) ×……
代码这里就不实现了