I want my program to take an integer and put every prime number up to that integer into an ArrayList. Logically I can't find why it doesn't work.
import java.util.ArrayList;
public class primenumbers {
public static void main(String[] args) {
int totalNumber = 1000;
ArrayList<Integer> numbers = new ArrayList<>();
for(int i = 1; i <= totalNumber; i++){
boolean isPrime = true;
for(int j = i-1; j >= 1; j--){
if (i % j == 0){
isPrime = false;
}else if(isPrime = true){
numbers.add(i);
}
}
}
System.out.println(numbers);
}
}
What it ends up doing is putting every number up to 1000 repeatedly into the list and printing it out. The nested for loop checks against every number smaller than the original for loop and checks if it has a remainder. I would think that would work as a prime check.
You have two bugs. One is testing i % 1 == 0
when j = 1
because your loop test was j >= 1
- should have been j > 1
. Second was testing isPrime
before your primality test is complete (and with an unfortunate typo }else if(isPrime = true){
assigns true
to isPrime
and evaluates to true
, use if(isPrime)
or if(isPrime == true)
if you must - it still needs to be tested after you loop through all i % j
tests). Fixing that, should look something like
public static void main(String[] args) {
int totalNumber = 1000;
ArrayList<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= totalNumber; i++) {
boolean isPrime = true;
for (int j = i - 1; j > 1; j--) {
if (i % j == 0) {
isPrime = false;
}
}
if (isPrime) {
numbers.add(i);
}
}
System.out.println(numbers);
}
And I then get
[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
Reviewing the code further, we could make a few optimizations; we know that factors of composite numbers must be less than or equal to the square root of the number (because x*x <= y where y is any composite number and x is a factor of y) and we also know that two is the only even prime. Thus we can start at three and increment by two (halving the tests). That leads to something like,
int totalNumber = 1000;
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(2);
outer: for (int i = 3; i <= totalNumber; i += 2) {
for (int j = (int) Math.sqrt(i); j > 2; j--) {
if (i % j == 0) {
continue outer; // It isn't prime, skip it
}
}
numbers.add(i);
}
System.out.println(numbers);