给定两个正整数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;
}
总结:以后写题一定要细心啊!!!不能思维定式。