首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稀土ArrayIndexOutOfBounds筛分

稀土ArrayIndexOutOfBounds筛分
EN

Stack Overflow用户
提问于 2011-10-09 23:47:22
回答 2查看 435关注 0票数 1

为了解决euler项目中的这个问题,尝试实现一个简单的erathosthenes筛子:

低于10的素数之和为2+3+5+7= 17。 找出二百万以下所有素数的总和。

链接

但是,我的代码一直返回此错误:

线程"main“java.lang.ArrayIndexOutOfBoundsException:-2147479015 at Prime.main(Prime.java:28)中的异常

有人能告诉我为什么吗?以下是代码:

代码语言:javascript
复制
import java.math.BigInteger;

public class Prime {
    /*
     * Input: an integer n > 1
     * 
     * Let A be an array of bool values, indexed by integers 2 to n, initially
     * all set to true.
     * 
     * for i = 2, 3, 4, ..., while i^2 ≤ n: if A[i] is true: for j = i^2, i^2 +
     * i, i^2 + 2i, ..., while j ≤ n: A[j] = false
     * 
     * Now all i such that A[i] is true are prime.
     */

        import java.math.BigInteger;

public class Prime {
    /*
     * Input: an integer n > 1
     * 
     * Let A be an array of bool values, indexed by integers 2 to n, initially
     * all set to true.
     * 
     * for i = 2, 3, 4, ..., while i^2 ≤ n: if A[i] is true: for j = i^2, i^2 +
     * i, i^2 + 2i, ..., while j ≤ n: A[j] = false
     * 
     * Now all i such that A[i] is true are prime.
     */

    public static void main(String[] args) {
        boolean[] array = new boolean[2000000];
        BigInteger counter = new BigInteger("0");
        for (int value = 0; value < array.length; value++) {
            array[value] = true;
        }
        for (int i = 2; i < array.length; i++) {
            if (array[i]) {
                int j = i * i;
                while (j > 0 && j < array.length) {
                    array[j] = false;
                    j += i;
                }
            }
        }
        for (int i = 2; i < array.length; i++) {
            if (array[i]) {
                counter = counter.add(BigInteger.valueOf(i));
            }
        }
        for (int value = 2; value < array.length; value++) {
            if(array[value]){
                System.out.println(value + ", ");
            }
        }
        System.out.println("\n" + counter);

    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-09 23:52:50

问题来自于以下几个方面:

代码语言:javascript
复制
        int j = i * i;
        while (j <= array.length) {
            array[j] = false;
            j += i;
        }

正在发生的事情是,有时i * i太大了,它绕过了拐角处(溢出),变成了负值。Java没有“检查”整数数学。要解决这个问题,您需要将while条件更改为以下内容

while(j > 0 && j < array.length)

而且,数组的大小是200,000,而不是2,000,000。

票数 4
EN

Stack Overflow用户

发布于 2011-10-09 23:51:20

这并不是说你很粗鲁,但这是因为你已经超出了数组的范围。i的限制是数组的长度,然后j等于i的最小平方。然后,j被用作要在第28行访问的数组的位置,这是超出界限的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7707354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档