HDU1124 一个数的阶乘的结果中包含 几个 0

分析:

输入整数 N,输出整数 N! 中,十进制表示情况下, 末尾 0 的个数。
因为 2*5=10 。所以N! 表达式中,考虑 2,5 的公共次数 就可以。
又因为 2的数目太多,所以公共次数 取决于 5的个数。
所以问题就转化为  N! 表达式中,能够分解出来的 5 的个数。


方法一:直接进行简单的暴力进行求解

#include <cstdio>   //G++  暴力简单模拟,超时。
int main()
{
    int value;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&value);
        if(value<=4)
            printf("0\n");
        else{
            int num = 0;
            int tmp = 1;
            for(int i=5;i<=value;i++){  //当 N=1e9 的时候,明显是 10秒啊,而且这才是一个案例。所以,不行。
                if(i%5==0){
                    tmp = i;
                    while(tmp%5==0){
                        ++num;
                        tmp /= 5;
                    }
                }
            }
            printf("%d\n",num);
        }
    }
    return 0;
}

2.运用数学规律求解

/*
N!的乘法展开式中 :是5的倍数的个数+是5^2的倍数的个数+5^3.....
如50!:
含有10个5的倍数的数:5,15,20,25,30,35,40,45,50 【50/5=10】
    含有2个5^2的倍数的数:25,50【50/(5^2)=2】
可见N!中一共有12个5相乘,那么尾0也必有12个
*/

#include <cstdio>   //AC G++ 78ms
int main()
{
    int value;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&value);
        int num = 0;
        value /= 5;
        while(value > 0){
            num += value;
            value /= 5;
        }
        printf("%d\n",num);
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值