pta刷题--统计末尾0的个数(定范围内阶乘版)

 

给定两个正整数A和B(A<B),请统计从A到B的所有整数的乘积的末尾有多少个0。例如:给定的两个数是10和20,那么需要计算的算式是:
10×11×12×13×14×15×16×17×18×19×20
该算式的结果是6704425728000,末尾有3个0。
这个算式的结果太大了,也许你能找到简便算法,不需要计算出整个算式的结果就能知道它末尾的0的个数!

输入格式

若干组空格分隔的2个整数A和B(A<B且都不超过100000),每组数据一行。

输出格式

每组输入数据对应输出一个整数,单独占一行,为从A乘到B的结果的末尾的0的个数。
###输入样例

1 10
125 128
1 100
21 24

输出样例

2
3
24
0

若题目为n!而不是范围内阶乘,求末尾0的个数,即求出这个阶乘式子中有多少组“2*5”,易知’2‘因子一定多余’5‘因子,即求出可以分解出’5‘因子的个数即为末尾0的个数。

第一次写题代码如下:

#include <stdio.h>

int main()
{
    int a=0,b=0;
    
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        int sum=0;
        int n=0;
    while(a<=b)
    {
        n=a;
        while(n%5==0)
        {
            sum++;
            n/=5;
        }
        a++;
     }
    printf("%d\n",sum);
    }
    
    return 0;
}

结果用例都通过,答案一直错误。

注:若为范围内的阶乘,’2‘因子不一定多余’5‘因子 (这块是我一开始犯的错误提醒一下自己要细心)。比如:25-26,’2‘因子有1个,’5‘因子却有2个。

所以这时候就要判断’2‘因子和’5‘因子的个数谁的少,谁的数量就为末尾0的个数。

#include <stdio.h>

int main()
{
    int a=0,b=0;
    
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        int sum5=0,sum2=0;
        int n=0;
    while(a<=b)
    {
        n=a;
        //计算‘5’因子的个数
        while(n%5==0)
        {
            sum5++;
            n/=5;
        }
        //添加计算‘2’因子的个数
        while(n%2==0)
        {
            sum2++;
            n/=2;
        }
        a++;
     }
        if(sum5>=sum2)
        {
    printf("%d\n",sum2);
        }else
        {
            printf("%d\n",sum5);
        }
    }
    
    return 0;
}

总结:以后写题一定要细心啊!!!不能思维定式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值