最多约数问题
题目描述
正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x)。例如,1,2,5,10都是正整数10的约数,且div(10)=4。 对于给定的2个正整数a<=b,编程计算a与b之间约数个数最多的数。
输入
输入的第1行有两个正整数a和b。
输出
若找到的a和b之间约数个数最多的数是x,则输出div(x)。
样例输入
1 36
样例输出
9
思路一:
遍历[a,b]之间每个数,分别求出每个数的约数个数,不断更新最大值即可
#include<iostream>
#include<cmath>
using namespace std;
int a , b;
int maxd;
int div(int x)
{
int count = 0;
for(int i = 1 ;i <= sqrt(x) ; i++)
{
if(x % i == 0)
count = count + 2;
}
if(sqrt(x)*sqrt(x)==x)
count--;
return count;
}
int main()
{
cin>>a>>b;
for(int i = a; i <= b ;i++)
{
int temp = div(i);
if(temp > maxd)
maxd = temp;
}
cout<<maxd;
return 0;
}
思路二:
利用唯一分解定理,任何一个大于1的自然数,都能分解成有限个质数的乘积
这里P均为质数,其指数a是正整数
那么它的正因子个数为(a1+1)(a2+1)…(ak+1)
#include<iostream>
#include<cstring>
using namespace std;
const int N = 110;
int a,b;
int st[N];//标记质因数的个数,底数为为数组下标
int maxd;
int div(int x)//求x的约数个数
{
memset(st,0,sizeof(st));
int sum = 1;
int copy = x;
for(int i = 2; i <= x/i; i++)
{
if(x%i==0)
{
while(x%i==0)
{
st[i]++;
x/=i;
}
}
}
if(x!=1)
st[x] = 1;
for(int i = 2; i<=copy/i ;i++)
{
sum = sum*(st[i]+1);
}
return sum;
}
int main()
{
cin>>a>>b;
for(int i = a ;i <= b; i++)
{
int temp = div(i);
if(temp > maxd)
maxd = temp;
}
cout<<maxd<<endl;
return 0;
}