我试图得到最大的素数,从3位数到100到999 但我的代码让我错误
public static void main(String[] args) {
int i ,counter;
//int arr[] = null;
ArrayList<Integer> arr = new ArrayList<Integer>();
for(counter=101 ; counter <999;counter++){
boolean check = true ;
for(i=2;i<counter;i++){
if(counter%i == 0){
check = false;
break;
}
}
if(check){
for(int index = 0;index<=arr.size();index++){
arr.add(counter);
}
}
}
System.out.println(arr.get(arr.size()-1));
}
我将数字放在数组列表中并尝试获取最后一个数字索引
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at Prime.main(Prime.java:23)
问题是什么?抱歉英语不好
答案 0 :(得分:5)
问题是由于以下代码段造成的。
for(int index = 0;index<=arr.size();index++){
arr.add(counter);
}
它将无限循环并导致在数组中添加如此多的对象,因此会出现OutOfMemory。
我认为这部分不需要for循环,即将其更改为
arr.add(counter);
代替。
答案 1 :(得分:3)
第二个for循环不是必需的并且保持循环。 最高数字从999开始并向下计数。 然后第一个结果是最后一个结果。
for (int counter = 999; counter >= 100; --counter) {
boolean check = true ;
for (int i = 2; i < counter/2; i++) {
if (counter%i == 0) {
check = false;
break;
}
}
if (check) {
System.out.println(counter);
break;
}
}
答案 2 :(得分:0)
您可能不需要上一个for
:
for(int index = 0;index<=arr.size();index++){
arr.add(counter);
}
而不是那样,您可以添加素数:
if(check){
arr.add(counter);
}
并在外面打印:
for(int i = 0; i<arr.size(); i++){
System.out.println(arr.get(i);
}
答案 3 :(得分:0)
public static void main(String[] args) {
int i, counter;
Integer greatestPrime = null;
//int arr[] = null;
/*ArrayList<Integer> arr = new ArrayList<Integer>();*/
for (counter = 101; counter < 999; counter++) {
boolean isPrime = true;
for (i = 2; i < counter; i++) {
if (counter % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
/*for(int index = 0;index<=arr.size();index++){
arr.add(counter);
}*/
greatestPrime = counter;
}
}
System.out.println(greatestPrime);
}