7657:连乘积末尾0的个数
题目链接:点击打开链接
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给定两个正整数a,b(a < b)。求连乘积:
a×(a+1)×(a+2)×...×(b-1)×b
的末尾有多少个0?
输入
- 一行,包括两个正整数a,b。a < b <= 10000 输出
- 一个整数,即连乘积末尾0的个数。 样例输入
-
11 56
样例输出
-
11
来源
《奥数典型题举一反三(小学五年级)》 (ISBN 978-7-5445-2882-5) 第三章 第三讲 习题4
题型/思路
分别计算得到每个数能拆分成多少个2和多少个5的乘积,形如2^i*5^j*k的形式。
最后统计所有乘积得到了多少个2和多少个5,如果2的数目比5多,取5的数目;如果5的数目比2多,取2的数目;
AC代码
#include <iostream>
using namespace std;
int cal2(int n){
int sum1=0;//计算因子为2的个数
while(n>0&&n%2==0){
n=n/2;//不会出现0~1的分数
sum1++;
}
return sum1;
}
int cal5(int n){
int sum2=0;//计算因子为5的个数 ;
while(n>0&&n%5==0){
n=n/5;
sum2++;
}
return sum2;
}
int main(int argc, char** argv) {
int a,b;
scanf("%d%d",&a,&b);
int ans1=0;//计算因子为2的个数
int ans2=0;//计算因子为2的个数
for(int i=a;i<=b;i++){
int x=i;
ans1+=cal2(x);
ans2+=cal5(x);
}
printf("%d",ans1>ans2?ans2:ans1);
return 0;
}