Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组索引超出范围(Eratosthenes的seve)_Java - Fatal编程技术网

Java 数组索引超出范围(Eratosthenes的seve)

Java 数组索引超出范围(Eratosthenes的seve),java,Java,有人能解释为什么我得到50000个数字的数组越界异常,而对于40000个数字,代码工作正常。这段代码是一个生成素数的埃拉托斯提涅斯算法 public static void primeThree (int number) { long startTime = System.currentTimeMillis(); ArrayList<Integer> myList = new ArrayList<Integer>(); boolean[] p = new boolea

有人能解释为什么我得到50000个数字的数组越界异常,而对于40000个数字,代码工作正常。这段代码是一个生成素数的埃拉托斯提涅斯算法

public static void primeThree (int number) {

long startTime = System.currentTimeMillis();
ArrayList<Integer> myList = new ArrayList<Integer>();

boolean[] p = new boolean[number + 1];

for(int i = 2; i < p.length; i++) {
  p[i] = true;
}
for(int i = 2; i < p.length; i++) {
  if (p[i] == true) {
    myList.add(i);
    for(int j = 2; j < p.length; j++) {
      if ((i * j) < number) {
        p[j * i] = false; //line number 99
      }
    }
}
}
long endTime = System.currentTimeMillis();

System.err.print(endTime - startTime); //prints time taken
System.out.println(myList.toString());
publicstaticvoidprimethree(整数){
long startTime=System.currentTimeMillis();
ArrayList myList=新的ArrayList();
布尔值[]p=新布尔值[number+1];
对于(int i=2;i
}

以下是错误描述:

java.lang.ArrayIndexOutOfBoundsException:-2147446155 在PrimeNumbers.primeThree(PrimeNumbers.java:99)


50000*50000=2500000000
,或25亿。最大java整数值为
2147483647
。您的整数值溢出了。尝试使用
long
而不是
int

来表示(long j=i*2;jfor(long j = i*2; j < p.length; j += i)
    p[j] = false;
p[j]=假;
错误准确地告诉您-2147446155

你不应该打负片,对吗?那就意味着你已经满溢了

溢出意味着您使用的数字太大,无法容纳所选的数据类型

你需要一个长的,浮动的,或者双人的;int无法处理如此大的数字

public static void primeThree (int number) {

long startTime = System.currentTimeMillis();
ArrayList<Integer> myList = new ArrayList<Integer>();

boolean[] p = new boolean[number + 1];

for(int i = 2; i < p.length; i++) {
  p[i] = true;
}
for(int i = 2; i < p.length; i++) {
  if (p[i] == true) {
    myList.add(i);
    for(int j = 2; j < p.length; j++) {
      if ((i * j) < number) {
        p[j * i] = false; //line number 99
      }
    }
}
}
long endTime = System.currentTimeMillis();

System.err.print(endTime - startTime); //prints time taken
System.out.println(myList.toString());
了解int的限制:


了解您的工具。

向我尖叫整数溢出。如果
/标记内的右大括号和代码部分(打开和关闭大括号)一致缩进,测试代码会更容易。