使用筛子找到小于长数的素数

时间:2016-08-11 14:29:07

标签: java primes sieve-of-eratosthenes

我必须找到小于或等于给定数字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]; 不起作用。 有人可以建议我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

你没有足够的记忆来代表整个筛子,因为它是以艾字节为单位的。即使BitSet也不适合您需要的所有索引,因为最终它uses是一个long数组来存储这些位。

您可以通过混合方法找到答案:

  • 构建并运行筛分至Integer.MAX_VALUE
  • 将素数最多Integer.MAX_VALUE收集到long s
  • 数组中
  • 注意到你可以在达到候选人号c
  • 的平方根时停止检查除数
  • 这意味着您已经拥有高于Integer.MAX_VALUE
  • 的值的所有潜在除数
  • 使用除数数组来过滤Integer.MAX_VALUEn
  • 之间的数字

由于您不需要在Integer.MAX_VALUE之后存储额外的素数,因此您的代码不会耗尽内存。