题目:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?
例如:N=10,N!=3 628 800,N!的末尾有两个0
解决方法:
两个大数字相乘都可以拆分多个质数相乘,而质数相乘结果为0的只有2*5。那么两个数相乘尾数为0的个数其实就是依赖2和5的因子个数。又因为每两个连续数字就会有一个2,个数很充足所以只需要关心5因子的个数就行了。
那么怎么计算n!中5因子的个数呢?
把5的倍数都找出来,n!=(5*k)(5(k-1)*…*5*A)A为不含5因子的数相乘的结果,n=5*k+r(0<=r<=4)。假设f(n!)是计算阶乘n尾数0的个数,而g(n!)是计算n!中5因子的个数的那么就会有以下公式:
f(n!) = g(n!) = g(5^k*k!*A)=k+g(k!)=k+f(k!)其中k=n/5取整数
举个栗子:
f(5!)=1+f(1!)=1;
f(10!)=2+f(2!)=2
f(20!)=4+f(4!)=4
f(1000!)=200+f(200!)=200+40+f(40!)=240+8+f(8!)=248+1+f(1!)=249
#include <iostream>
using namespace std;
int GetN_1(int n)
{
if(n<5)
return 0;
else
return (n/5+GetN_1(n/5));
}
int main()
{
cout<<GetN_1(10)<<endl;
return 0;
}