最多约数问题

问题描述:正整数x的约数是能整除x的正整数。设a和b是两个正整数,a<=b,找出a和b之间约数个数最多的数x。
输入输出样例:
Input:
1 36
Output:
9

还是枚举求a,b之间每个数的约数个数,算约数个数采用分解质因数的方法。
质数p1<p2<p3<……<pn,正整数A分解质因数的结果是:
A=(p1^m1)×
(p2^m2)×
……×(pn^mn)。
那么,A的所有正约数共有(m1+1)×(m2+1)×……×(mn+1)个。
所有正约数的和为:
(1+p1+p1²+……+p1^m1)
×(1+p2+p2²+……+p2^m2)
×……
×(1+pn+pn²+……+pn^mn)。

比如:360=222335,那么360的约数有43*2=24个。

代码实现:

#include<iostream>//最多约数问题
#include<algorithm>
using namespace std;
int Num(int n){
	int ans=1;
	for(int i=2;i*i<=n;i++){
		int num=0;
		while(n%i==0){
			num++;
			n/=i;
		}
		if(num>0){
		    num++;
			ans*=num;
		}
	}
	if(n>1) ans*=2; //把小于根号m的数字枚举过了还未将m分解完,说明还有一个大于根号m的质数约数,因此乘以2
	    return ans;
}
int main(){
	int a,b;
	cin>>a>>b;
	int Maxn=0;
	for(int i=a;i<=b;i++){
		Maxn=max(Maxn,Num(i));
	}
	cout<<Maxn<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值