计算阶乘结果中0的个数【每日一题】

题目:给定一个整数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值