正整数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 之间约数个数最多的数。
思想:设正整数x的质因子分解为
x=p1^N1 × p2^N2 ×……pi^Ni
则 div(x)=(N1+1)(N2+1)……(Ni+1)
源代码如下:
#include <stdio.h>
#define MAXP 10240
#define true 1
#define false 0;
int prim[MAXP];
int get[MAXP];
int total;
void prime()
{
int get[MAXP+1];
int i, ii, j;
for( i = 2; i < MAXP; i++) {
get[i] = true;
}
for (i = 2; i <= MAXP; i++) {
if (get[i]) {
j = i + i;
}
while (j <= MAXP) {
get[j] = false;
j += i;
}
}
for (ii = 2, total = 0; ii <= MAXP; ii++) {
if (get[ii]) {
prim[total++] = ii;
}
}
}
int div(int n) {
int i = 0;
int count = 1;
int temp = n;
int t = 0;
if (n == 1 ) {
return 1;
}
if (get[n]) {
return 2;
}
while (prim[i] <= n/2) {
if (temp % prim[i] == 0) {
t++;
temp /= prim[i];
}
else if (t == 0) {
i++;
}
else {
count *= (t + 1);
i++;
t = 0;
}
}
return count;
}
int main()
{
int a, b;
int i;
prime();
while(scanf("%d%d", &a, &b) != EOF) {
int max = 0;
int num = 0;
for (i = a; i <= b; i++) {
if ( max < div(i) ) {
max = div(i);
num = i;
}
}
printf("%d : %d\n", num, max);
}
return 0;
}