【发布时间】:2016-08-11 14:29:06
【问题描述】:
我必须找到小于或等于给定数字n 的素数数量。我正在使用埃拉托色尼筛法寻找素数。
这是我写的代码:
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];
不起作用。
有人可以建议我解决这个问题的方法吗?
【问题讨论】:
-
您已经为您的筛子购买了 10 Exabytes 内存,对吧?
-
有更节省空间的方法来存储布尔序列。例如,一个位域。此外,您实际上不必在筛子中表示偶数。
-
@khelwood 这将把他带到 2^36 - 比 2^31 有了很大的改进,但仍然比他想要达到的 2^63 差很多。
-
您可能对segmented sieve 感兴趣。
标签: java primes sieve-of-eratosthenes