方法1:搜索寻找
const int prime[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
__int64 maxsum,bestnum, n;
void make(__int64 num, __int64 k,__int64 sum,int limit)
{//num:当前枚举到的数,k:枚举到的第k大的质因子;sum:该数的约数个数;limit:质因子个数上限;
int i;
__int64 temp;
if(sum > maxsum)
{
maxsum = sum;
bestnum = num; //如果约数个数更多,将最优解更新为当前数;
}
if(sum==maxsum && bestnum > num)
bestnum = num; //如果约数个数相同,将最优解更新为较小的数;
if(k > 15)
return;
temp = num;
for(i=1; i<=limit; i++) //开始枚举每个质因子的个数;
{
if(temp*prime[k] > n)
break;
temp = temp * prime[k]; //累乘到当前数;
make(temp, k+1, sum*(i+1), i); //继续下一步搜索;
}
}
方法2:筛选法
for (i=1;i<5050;i++)
for (j=1;j*i<5050;j++) //对于任何一个数,有一个因子就加一
s[i*j]++;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
c=a;
for (i=a;i<=b;i++)
if (s[i]>s[c]) c=i;
printf ("%d\n",c);
}