版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38851184/article/details/82858746
最多约数问题。正整数x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设a 和b 是两个正整数,找出a 和b 之间约数个数最多的数x 的约数个数。
样例输入:
1 36
样例输出:
9
这道题有个数学上的知识,就是:一个合数的约数个数等于它所有质因数的次方加上一再相乘。
即:x=n1^m1+n2^m2+...+nn^mn(x为合数,n1...nn为其质因数,m1...mn为对应于其质因数的次方数),x的约数个数为:(m1+1)*(m2+1)*(m3+1)*...*(mn+1)
那么根据这个思想,代码的实现如下:
#include <bits/stdc++.h>
using namespace std;
int vis[100] = {0};
int prim[100];
int cnt=0;
void IsPrimm()
{
int i,j;
for( i=2; i<100; i++)
{
if(vis[i] == 0)
{
for(j=i*2; j<100; j+=i )
{
vis[j] = 1;
}
}
}
for(i=2; i<100; i++)
{
if(vis[i] == 0)
prim[cnt++] = i;
}
}
int f(int n)
{
int i,t=1,k=0;
for(i=0; i<cnt && prim[i]<=n;i++)
{
if(n%prim[i] == 0)
{
k=0;
while(n%prim[i] == 0)
{
k++;
n = n/prim[i];
}
t = t*(k+1);
}
}
return t;
}
int main()
{
IsPrimm(); //先求0~100所有素数
int i,a,b,maxx = 0;
cin>>a>>b;
for(i=a; i<=b; i++)
{
if(f(i) > maxx)
maxx = f(i);
}
cout<<maxx<<endl;
return 0;
}