【计算连乘积中末尾0的个数】OpenJudge NOI 7657:连乘积末尾0的个数

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;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值