hdu 1124 Factorial(数论:推理)

求N!末尾有多少个0,首先想到0出现的条件,因为10的因子有(2,5) (1,10)

所以出现0,必须为5和一个偶数相乘或者10的整数倍和任意一个数相乘

而10的整数倍又可以看做5和一个偶数相乘的结果

因为一个数中偶数一定比5多,因此判断一个数中含有多少个5即可!

那么只是简单除以5对不对呢?不对!因为数目中可能含有5的阶乘,如25,125

所以要一直除以5直到小于5,而把这个过程中的商加起来,就是所含5的个数!

刚开始的想法就是模拟阶乘求解过程,判断每次相乘后是否为10的倍数,之后再取余数继续下一步

现在想想这样做肯定是错的,因为给出一个1000000000就超时了

代码如下:

#include <stdio.h>
int main(void) {
    int n, T, ans;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        ans = 0;
        while(n) {
        	n /= 5;
        	ans += n;
        }
        printf("%d\n", ans);
    }
    return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值