题目分析:正整数 x的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。
设 a 和 b 是两个正整数,找出 a 和 b 之间约数个数最多的数 x的约数个数。
1、暴力法(依次记录区间范围内每一个数的约束个数,取最大值)
int prime(int a, int b)
{
int max = a > b ? a : b;
int min = a < b ? a : b;
int ncount = 0; // 约束个数
int maxAppro = 2; // 最多约束个数
int maxApproPos = min;
for (int j=min; j<=max; j++)
{
ncount = 0;
for (int i=1; i<=max && i<=j; i++)
{
if (j % i == 0)
ncount++;
}
if (maxAppro < ncount)
{
maxAppro = ncount;
maxApproPos = j;
}
}
System.out.println(maxApproPos+"约数最多,有"+ maxAppro +"个");
return maxApproPos;
}
2、质因子分解
一个合数可以分解为多个素数相乘,而每个素数之间相互匹配相乘的结果定为合数的因子,而匹配的种类数一定
为每个素数的数量即为其指数的乘积,但是每个素数可以与其自身匹配,当合数表示为:n=a1^N1*a2^N2...,
所以约数数量为count=(N1+1)*(N2+1)....。
int prime(int n)
{
int[] m = new int[n/2+1]; // 默认值是0
int ncount = 1;
int k = n;
for (int i=2; i<=k/2; i++) // 质因子最大值为n/2
{
if (n%i == 0)
{
m[i]++; // 质因子出现一次
n /= i; // 减小n的规模
i--; // 还原i值
}
}
// 根据每个质因数出现的次数计算n的约束个数
for (int j=2; j<=k/2; j++)
{
if (m[j] > 0)
{
ncount *= (m[j]+1);
}
}
return ncount;
}
int get(int a, int b)
{
int maxAppro = 0; // 最多约束个数
int maxApproPos = a;
int val = 0;
for (int i=a; i<=b; i++)
{
val = prime(i);
if (maxAppro < val)
{
maxAppro = val;
maxApproPos = i;
}
}
System.out.println(maxApproPos+"约数最多,有"+ maxAppro +"个");
return maxApproPos;
}