我必须找到小于或等于给定数字n
的素数的数量。我正在使用Eratosthenes的Sieve寻找素数。
这是我写的代码:
static int find_prime(int n) {
boolean[] arr = new boolean[n+1];
Arrays.fill(arr, true);
for(int i=2;i<=n;i++) {
if(arr[i]==true) {
for(int j=2*i; j<=n; j+=i)
arr[j] = false;
}
}
int count=0;
for(int i=2;i<=n;i++) {
//System.out.print(arr[i]+" ");
if (arr[i] == true)
count++;
}
return count;
}
此代码适用于integer
值,但我必须为long
数字实现它。并且Java不允许创建long
大小的数组,因此boolean[] arr = new boolean[n+1];
不起作用。
有人可以建议我解决这个问题吗?
答案 0 :(得分:2)
你没有足够的记忆来代表整个筛子,因为它是以艾字节为单位的。即使BitSet
也不适合您需要的所有索引,因为最终它uses是一个long
数组来存储这些位。
您可以通过混合方法找到答案:
Integer.MAX_VALUE
Integer.MAX_VALUE
收集到long
s c
Integer.MAX_VALUE
Integer.MAX_VALUE
和n
由于您不需要在Integer.MAX_VALUE
之后存储额外的素数,因此您的代码不会耗尽内存。