问题描述: 正整数x 的约数是能整除x 的正整数。正整数x的约数个数记为div(x)。例如,1,2, 5,10 都是正整数10的约数,且div(10)=4。设a 和b是2 个正整数,a≤b,找出a 和b之间 约数个数最多的数x。
算法设计: 对于给定的2 个正整数a <= b 计算a 和b之间约数个数最多的数。 可以保证a和b都不超过2000000.
数据输入: 输入数据有2个正整数a和b。
结果输出: 若找到的a 和b之间约数个数最多的数是x,将div(x)输出。
Sample Input
1 36
Sample Output
9
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
#include<string>
#define MAX 2000010
using namespace std;
const double pi = 4.0 * atan(1.0);
typedef unsigned long long uLL;
typedef signed long long LL;
int flag[MAX], cnt[MAX];
int cal(int i, int x)
{
x = x/i;
int cnt = 1;
while(x % i == 0)
{
x /= i;
cnt ++;
}
return cnt;
}
void set()
{
for(int i = 0;i <= MAX;i ++)
cnt[i] = 1;
flag[0] = flag[1] = 1;
for(int i = 2;i <= MAX;i ++)
{
if(!flag[i])
{
for(int j = 2;i*j <= MAX;j ++)
{
flag[i*j] = 1;
cnt[i*j] *= (cal(i, i*j)+1);
}
}
}
}
int main()
{
set();
int a, b;
while(cin >> a >> b)
{
int max = 0;
for(int i = a;i <= b;i ++)
{
if(cnt[i] > max)
max = cnt[i];
}
if(max == 1)
max ++;
printf("%d\n", max);
}
}