Java 数组索引超出范围(Eratosthenes的seve)
有人能解释为什么我得到50000个数字的数组越界异常,而对于40000个数字,代码工作正常。这段代码是一个生成素数的埃拉托斯提涅斯算法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
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的限制:
了解您的工具。
/标记内的右大括号和代码部分(打开和关闭大括号)一致缩进,测试代码会更容易。