简体   繁体   中英

java unable to find the error to print a prime number

This program gets 4 input from the user and prints out all the pairs except for the duplicate pairs. I wanted it print only the pairs that sum equals a prime number. I did the entire program there is no compilation error but in the output it prints to all pairs except the duplicate pair(i want it to print only the pair whose sum= a prime number) can anyone tell me what i am doing wrong

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prime {
    public static List<Integer> numbers = new ArrayList<>(); // a list of integers that was accepted, can be acced in the order they were added
    public static Scanner input = new Scanner(System.in);
    public static void main(String args[])
    {
        int inputs = 4; 
        input(inputs);
        for(int i = 0; i < inputs; i++){ 
            for(int j = 0+i; j < inputs; j++){
                if(i != j) 
                    System.out.println(numbers.get(i)+ " + " + numbers.get(j) + " = "+ isPrime(numbers.get(i) + numbers.get(j)));                  
            }
        }   }   

    public static int isPrime (int sumPair)
    {
        boolean primeVal =true ;
        if(sumPair < 2)
            primeVal= false;            
        else if(sumPair ==2)
            primeVal=true;         
        else if (sumPair % 2 == 0)
            primeVal = false;
        else
        {
            int stop = (int)Math.sqrt(sumPair);
            for (int d = 3; d <= stop && primeVal; d = d + 2)
            {
                if (sumPair % d == 0)
                    primeVal = false;
            }
        }
        return(sumPair);
    }

    public static void input(int inputNumbers) 
    {
        while(numbers.size() < inputNumbers){ // while there is more inputs needed
            System.out.print("Enter a positive integer: ");
            int num = input.nextInt();
            if(num > 0) // if the input is valid
                numbers.add(num);
            else // if the input is not valid
                while (num <= 0) { // while the input is not valid
                    System.out.print("Enter a positive integer: ");
                    num = input.nextInt(); // get the next int if it wasn't valid
                    if(num > 0) { // if the input gets valid
                        numbers.add(num);
                    }
                }
            System.out.println("Thank you.");
        }
    }

    public static int sumPair(int num1, int num2)
    {    
        return num1 + num2;
    }

}

You go to a lot of trouble to compute a boolean primeVal which tells whether the input be true or false , but you never actually return this value. Try this instead:

public static boolean isPrime (int sumPair) {
    boolean primeVal = true;
    if (sumPair < 2 || sumPair % 2 == 0) {
        primeVal = false;            
    }      
    else {
        int stop = (int)Math.sqrt(sumPair);
        for (int d=3; d <= stop; d += 2) {
            if (sumPair % d == 0) {
                primeVal = false;
                break;
            }
        }
    }
    return primeVal;
}

Use this main() method:

public static void main (String args[]) {
    int inputs = 4; 
    input(inputs);
    for (int i=0; i < inputs-1; i++) { 
        for (int j=i+1; j < inputs; j++) {
            boolean prime = isPrime(numbers.get(i) + numbers.get(j));
            if (prime) {
                System.out.println(numbers.get(i) + " + " + numbers.get(j));
            }                
        }
    }
}  

Your condition to determine if you print the current pair or not is if(i != j) , so it will only print if i is different from j (duplicate).

You made a nice isPrime function, you should call it.

You made your isPrime function return an int, and I'm pretty sure it should return a boolean instead. Also, it returns the argument you gave it, so it does virtually nothing except spend time in a potentially expensive operation. Perhaps should it return primeVal instead.

Your code should look like:

for(int i = 0; i < inputs; i++){ 
  for(int j = 0+i; j < inputs; j++){
    ni = numbers.get(i);
    nj = numbers.get(j);
    if(isPrime(ni+nj)){
      System.out.println(ni + " + " + nj + " = "+  (ni + nj));                  
    }
  }
}

What this does is get the numbers for indexes i and j and store them in ni and nj respectively. Then, it checks it their sum is prime. If it is, then it prints the sum.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM