1-3 最多约数问题

问题描述: 
正整数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;
}

posted on 2013-03-09 14:34  愤怒的屎壳螂  阅读(344)  评论(0编辑  收藏  举报

导航