Java 用筛法求小于长数的素数

Java 用筛法求小于长数的素数,java,primes,sieve-of-eratosthenes,Java,Primes,Sieve Of Eratosthenes,我必须找到小于或等于给定数的素数。我用埃拉托斯烯筛来寻找素数 这是我写的代码: 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] = fal

我必须找到小于或等于给定数的素数。我用埃拉托斯烯筛来寻找素数

这是我写的代码:

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;
}
static int find_prime(int n){
布尔值[]arr=新布尔值[n+1];
数组。填充(arr,true);

对于(int i=2;i您将没有足够的内存来表示整个筛选,因为它是以EB为单位的。即使它也不能满足您需要的所有索引,因为它最终需要一个
long
s数组来存储位

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

  • 构建并运行一个最大为
    Integer.MAX\u值的筛选
  • 将最大值为
    Integer.MAX_值的素数收获到
    long
    s的数组中
  • 注意,当达到候选编号的平方根
    c
  • 这意味着对于大于
    Integer.MAX\u VALUE
  • 使用除数数组过滤
    整数.MAX_值
    n

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

您将没有足够的内存来表示整个筛选,因为它是以EB为单位的。即使它也不能满足您需要的所有索引,因为它最终需要一个
long
数组来存储点点滴滴

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

  • 构建并运行一个最大为
    Integer.MAX\u值的筛选
  • 将最大值为
    Integer.MAX_值的素数收获到
    long
    s的数组中
  • 注意,当达到候选编号的平方根
    c
  • 这意味着对于大于
    Integer.MAX\u VALUE
  • 使用除数数组过滤
    整数.MAX_值
    n

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

可能重复您已经为筛选购买了10个内存,对吗?有更节省空间的方法来存储布尔序列。例如,一个位字段。此外,您实际上不必重新表示“筛子中的数字不是偶数。@khelwood这将使他达到2^36-比2^31有很大的改进,但距离他试图达到的2^63还有一点距离。你可能会对一个。可能的副本感兴趣。你已经为你的筛子购买了10个内存,对吗?有更节省空间的方法来存储布尔序列。”eans。例如,一个位域。另外,你也不必在筛子中表示偶数。@khelwood这将使他达到2^36-这比2^31有很大的改进,但距离他试图达到的2^63还有一段距离。你可能对A感兴趣。谢谢你提到位集并没有减少内存需求够了。如果我想对了,它仍然需要多达2^60字节的内存。我不相信当前的普通桌面处理器可以解决这么多。感谢您提到,位集并没有充分减少内存需求。如果我想对了,它仍然需要多达2^60字节的内存。我不相信当前的普通桌面处理器可以解决这一问题。