【问题标题】:Prime numbers upto 10^8 using sieve使用筛子达到 10^8 的素数
【发布时间】:2020-06-01 08:01:39
【问题描述】:

为什么这段代码只能在小于 10^4 的数字上工作?我需要找到所有小于 10^8 的素数,但这显示 arrayindexoutofbound 异常?为什么?我知道我们只能创建数组直到 size10^8(如果我错了,请纠正我)但这甚至不适用于 10^5。

 class Prime
    {
        public static void main (String[] args) throws java.lang.Exception
        {
            boolean[] prime = new boolean[100000000];
            prime[2]=true;
            int i;
            for(i=3; i<100000000; i+=2)
                prime[i]=true;
            for(i=3; i<100000000; i++)  
            {
                if(prime[i]==true)
                    for(int j=i*i; j<100000000; j=j+i)
                        prime[j]=false;
            }
            for(i=1; i<100000000; i++)
            {
                if(prime[i]==true)
                System.out.println(i);
            }
        }
    }

【问题讨论】:

  • 您永远不会使用一半的阵列。例如,您永远不会访问 prime[4]。您可能还想查看 bitset 而不是布尔数组。
  • @rossum 我正在使用素数筛,我已经假设除 2 之外的偶数不是素数。
  • @Eran 谢谢。但这不是重点……这只是一个例子……我想为 10^8 个数字运行此代码。
  • @Eran 我想为 10^8 的数字运行它,但任何大于 10^4 的数字都会显示 arrayindexoutofbound 异常。
  • @Eran 您现在可以查看代码并说明为什么显示 arrayindexoutofbound 异常吗?我编辑了帖子

标签: java arrays primes sieve-of-eratosthenes


【解决方案1】:

问题出在这里:

for(int j=i*i; j<100000000; j=j+i)

由于i 可以和99999999 一样大,所以i*i 可能大于Integer.MAX_VALUE,这会导致数值溢出。结果j会被初始化为负值,prime[j]会抛出异常。

要解决此问题,您只需添加一个条件,要求 j 必须为正:

for(int j=i*i; j > 0 && j<100000000; j=j+i)

【讨论】:

    【解决方案2】:
    for(int j=i*i; j<10000; j=j+i)
    

    如果i为10^5,则j为10^10,导致int型溢出(int型最大值为2^31 - 1 = 2147483647)

    【讨论】:

    • 那该如何纠正呢?我想找到所有小于 10^8 的素数。这只是一个例子
    • 我还没有关注你的逻辑,只是重新尝试将 int 类型更改为 long 类型,看看它是否有效
    • 它不起作用,因为数组只接受整数作为它的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多