POJ 1401 Factorial

http://poj.org/problem?id=1401

题意:

求n的阶乘末尾有几个0


思路:

思路很简单,只要找因子里5的个数,因为2肯定比5多(别问我为什么),一开始我是依次找每个乘数里5的个数,结果显而易见,TL,我自己都为我的智商惊叹了。。。实际上,(以下网上抄的)1~N中只有5的倍数包含5因子,比如[5, 10, 15, 20...],所以我们抽出其中每个数的一个5因子,这时候就只剩下[1, 2, 3, ...., N/5]了,其他没有5因子的就都给扔掉就行了。 
你会发现新产生的这个序列又是一个相同的问题。 
写出递推式就是:F(n) = n/5 + f(n/5),可以用递归也可以用循环实现。


擦。。。所以说。。。智商是硬伤。。。


代码:


TL的代码:

#include <cstdio>
#define LL long long

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        LL sum = 0;
        for(int i = 1; i <= n; i++)
        {
            int x = i;
            while(x % 5==0)
            {
                sum = sum++;
                x = x / 5;
            }
        }
        printf("%I64d\n", sum);
    }
    return 0;
}

A了的代码:

#include <cstdio>
#define LL long long

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        LL sum = 0;
        while(n)
        {
            sum = sum + n / 5;
            n = n / 5;
        }
        printf("%I64d\n", sum);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值