鉴于n
,我需要具有正好8个除数的数字。
24 = 1, 2, 3, 4, 6, 8, 12, 24
100
以下有10个符合上述条件的数字。
24, 30, 40, 42, 54, 56, 66, 70, 78 and 88
。
给定n,有多少数字满足n
以下的上述条件。
第一种方法:
我使用了素因子方法。
x = p1^k1 * p2 ^k2 * p3^k3 ...
n = (k1 + 1)(k2 + 1)(k3 + 1)...
处理大数字时,这种方法有点慢。
int max = 1000000000;
int count = 0;
for(int i = 0; i < max; ++i)
if(check(i))count++;
private static boolean check(int num) {
int ans = 1;
int count = 0;
while (num % 2 == 0) {
num /= 2;
count++;
}
ans *= (count + 1);
if (ans > 8)
return false;
for (int i = 3; i * i <= num; ++i) {
count = 0;
while (num % i == 0) {
count++;
num /= i;
}
ans *= (count + 1);
if (ans > 8)
return false;
}
if (num != 1)
ans *= 2;
if (ans > 8)
return false;
return ans == 8;
}
第二种方法:
筛选类似的方法,它标记数字的所有倍数,然后检查计数是否为8
。
static int max = 100000000;
static int[] facs = new int[max];
for (int i = 2; i < max; ++i) {
for (int j = i; j < max; j += i) {
facs[j]++;
}
}
int count = 0;
for (int i = 0; i < max; ++i)
if (facs[i] == 7)//1 is a factor of all number so check for count 7
count++;
System.out.println(count);
然而,这种方法有点快,但不能用于10^9
以上的更大数字。
如何计算正好超过10^9
的8个除数的数字?
我有什么诡计吗?我怎样才能改善这个?
答案 0 :(得分:0)
重点是找到数字的数量,而不是从迭代到计算减少问题的数字。
对于有8个除数的数字,它应该用3种形式之一写成。
p1 * p2 * p3
p1^3 * p2
p^7
因为,来自公式8 = 2 * 2 * 2 or 4 * 2 or 8 * 1
因此,如果我们知道有多少素数低于n
,我们就可以找出可能有8
除数的组合。
p1*p2*p3:
The maximum `p` can be `N / 2 * 3`.
So the number of numbers which have `8` divisors are nC3.
p1^3*p2:
The maximum `p` can be `N/8`.
So the number of numbers which have `8` divisors are nC2.
p^7:
The maximum `p` can be `N^(1/7)`.
So the number of numbers which have `8` divisors are `n`.
Here, `n` is the number of primes under `N`
因此,要找出n
下N
下的素数数量,
我们可以使用Prime Counting Function而不是计算素数。
因此,一旦知道素数的数量,就可以通过选择性组合来计算数量。