问题描述:正整数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;
}