import java.util.ArrayList;
public class LargestPrimeFactor {
private static long maxNum;
public LargestPrimeFactor(long maxNum) {
LargestPrimeFactor.maxNum = maxNum;
ArrayList<Long> listOfPrimes = new ArrayList<>();
listOfPrimes.add(2L);
for (long i = 3; i < maxNum / 2; i++) {
if (i % 2 == 1 && isPrime(i)) {
listOfPrimes.add(i);
}
}
// for (long i = 0; i < listOfPrimes.size(); i++) {
// System.out.println(listOfPrimes.get((int) i));
// }
for (long i = listOfPrimes.size() -1; i >= 0; i--) {
if (maxNum % ((long) listOfPrimes.get(i)) == 0) {
System.out.println("Max Prime Factor is: " + listOfPrimes.get(i));
break;
}
// System.out.println(listOfPrimes.get((int) i));
}
}
private boolean isPrime(long num) {
for (long i = 2; i < num; i++ ) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
The problem in my code is following: enen if I autobox to <Long>, Java requires to cast to int when I use listOfPrimes::get. It is not desired because the numbers I would work with would be out of scope. How can I fix that?
Advertisement
Answer
In this loop
for (long i = listOfPrimes.size() - 1; i >= 0; i--) {
if (maxNum % ((long) listOfPrimes.get(i)) == 0) {
System.out.println("Max Prime Factor is: " + listOfPrimes.get(i));
break;
}
}
You should change the type of i from long to int. This is not saying that the numbers in listOfPrimes must be int, it only says that the count of elements in listOfPrimes must be representable with a 32bit signed integer.
Indeed, listOfPrimes.size() returns an integer, not a long. In Java, the length of an array is always specified by an int. Hence an array cannot hold more elements than an int can count. As a result, an ArrayList cannot hold more elements either.
Moreover, the Collection.size() method returns an int, so that none of the classes that implement the Collection interface can hold more values.
Edit: As mentioned by user16320675 in the comments, collections can hold more elements than Integer.MAX_VALUE. You just have to be careful about what size() returns in those cases: it returns Integer.MAX_VALUE rather than the actual size.