java unable to find the error to print a prime number - java

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.

Related

Prime number check java

Write a program to read n numbers. The first number specified as input will be n. Next, the program should read n integer numbers.
The program should check for each number if it is prime as well as if its reverse is prime.
Display all such numbers in ascending order.
Consider below example for input and output:
Input:
7
11
12
23
19
7
113
101
Output:
7
11
101
113
My code
public class Prime {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int temp;
int[] a = new int [x];
int[] r = new int [x];
int[]c = new int[a.length+r.length];
int[] rev = new int [x];
for(int i=0;i<x;i++){
a[i] = sc.nextInt();
rev[i]=a[i];
}
for(int i = 0; i < a.length; i++) {
while(rev[i] != 0) {
r[i] = r[i] * 10;
r[i] = r[i] + rev[i]%10;
rev[i] = rev[i]/10;
}
}
for(int i = 0; i < a.length; i++) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if((a[i]%j==0) || (r[i]%j==0)) {
isPrime = false;
break;
}
}
if(isPrime)
System.out.println(a[i]);
System.out.println(r[i]);
}
}
}
Somewhere I am stuck I don't know how to eliminate repeated no, how to merge the array at last and also it is printing 1 and 2 as prime no when I give input and 2
You need to use TreeSet - which will contain only distinct elements and give result in sorted form. You can refer to following code-
Set<Integer> set = new TreeSet<>();
for(int i = 0; i < a.length; i++) {
boolean isPrime = true;
if(isPrime(a[i]) && isPrime(r[i]))
set.add(a[i]);
}
Iterator it = set.iterator();
while(it.hasNext())
System.out.print(it.next() + " ");
Also create a function for checking prime numbers -
private static boolean isPrime(int num) {
if(num==1) return false;
for(int i = 2; i <= num/2; ++i)
{
if(num % i == 0)
{
return false;
}
}
return true;
}
You can try below code. Hope it helps you,
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class PrimeNumberTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(7, 11, 12, 23, 19, 7 ,113, 101));
//To remove duplicates
Set<Integer> set = new TreeSet<>(list);
System.out.println(getPrimeNumbers(set).toString().replaceAll(",", "").replace("]", "").replace("[", ""));
}
//Method to get unique ordered set of prime numbers
private static Set<Integer> getPrimeNumbers(Set<Integer> set) {
Set<Integer> resultList=new TreeSet<>();
set.forEach(ele->{
//check for prime
if(isPrime(ele)){
//if prime number check for reverse and if true, add to result
if(isPrime(reverserNumb(ele)))
resultList.add(ele);
}
});
return resultList;
}
private static boolean isPrime(int num){
if(num<2)
return false;
// Check for even numbers
if (num % 2 == 0) {
return num == 2;
}
// Check for odd numbers
for (int i = 3; i*i <= num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
private static int reverserNumb(int num) {
return Integer.valueOf(new StringBuilder(String.valueOf(num)).reverse().toString());
}
}
Here is the code for prime test using √n approach
static boolean isPrime(int n){
//corner case
if (n <= 1) return false;
if (n <= 3) return true;
//middle 5 number
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false;
return true;
}
Use can use set for remove duplicate element
Try if this code works, hope it helps
Code:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class PrimeNumbers {
static ArrayList<Integer> prime = new ArrayList<>();
public static void main(String[] args) {
Scanner user_input = new Scanner(System.in);
System.out.print("Enter Number of Integers: ");
int number_count = user_input.nextInt();
int[] numbers = new int[number_count];
for (int i = 0; i < numbers.length; i++) {
System.out.print("Enter Integer: ");
numbers[i] = user_input.nextInt();
}
System.out.print("Values Entered: ");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
checkPrime(numbers[i],false); //false don't reverse
checkPrime(numbers[i],true); //true reverse value to check if it is also prime
}
System.out.print("\nList of prime numbers: ");
Collections.sort(prime);
for(int n : prime){
System.out.print(n + " ");
}
if(prime.isEmpty()){
System.out.print("no prime numbers on list\n");
}
}
//check for duplicates
static void insertValueToPrime(int n){
for(int p : prime){
if(n == p){
return;
}
}
prime.add(n);
}
static void checkPrime(int n,boolean isReverse) {
int i, m = 0, flag = 0,realn = n;
if(isReverse){
n = reverseNumber(n);
}
m = n / 2;
if (n == 0 || n == 1) {
//no a prime number
} else {
for (i = 2; i <= m; i++) {
if (n % i == 0) {
// not a prime number
flag = 1;
break;
}
}
if (flag == 0) {
insertValueToPrime(realn);
}
}
}
static int reverseNumber(int n){
String reverse = "",str=""+n;
for(int i = str.length() - 1; i >= 0; i--)
{
reverse = reverse + str.charAt(i);
}
return Integer.parseInt(reverse);
}
}

I am trying to make a program which will take a number and display the prime number before and after it

I am trying to make a program which will take user input as an integer and will display the prime number before it and after it. I cannot see what I have done wrong as the output is nothing. It would be great if somebody could help!
package prime;
import java.util.Scanner;
public class Prime
{
boolean flag = false;
public boolean isPrime(int x)
{
for (int i = 2; i <= x/2; i++)
{
if (x % i == 0)
{
flag = true;
return flag;
}
}
}
public static void main(String [] abc)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter an number. A prime number preceeding and succeeding that number will be displayed.");
int num = sc.nextInt();
Prime p = new Prime();
for (int j = num;j < num && j > 0;j--)
{
if (p.isPrime(j-1) == true)
{
System.out.println("Prime number predeceeding " + num + " : " + j);
break;
}
}
for (int j = num;j > num;j++)
{
if (p.isPrime(j+1) == false)
{
System.out.println("Prime number succeeding " + num + " : " + j);
break;
}
}
}
}
Here is a modified working code.
Made some changes:-
1.Initialized flag to true and if we find any factor just return false.
2.For finding a greater prime number just start an infinite loop from num+1. But do make sure that the input number is within the Integer value bound i.e 65535.
import java.util.Scanner;
public class Prime
{
boolean flag = true;
public boolean isPrime(int x)
{
for (int i = 2; i < x/2; i++)
{
if (x % i == 0)
{
return false;
}
}
return flag;
}
public static void main(String [] abc)
{
Scanner sc = new Scanner(System.in);
System.out.println("Enter an number. A prime number preceeding and succeeding that number will be displayed.");
int num = sc.nextInt();
Prime p = new Prime();
for (int j = num-1; j > 0; j--)
{
if (p.isPrime(j))
{
System.out.println("Prime number predeceeding " + num + " : " + j);
break;
}
}
for(int j=num+1; ;j++)
{
if (p.isPrime(j))
{
System.out.println("Prime number succeeding " + num + " : " + j);
break;
}
}
}
}
Hope this helps!
Your condition on both the for loops will evaluate to false. In the first case:
for (int j = num;j < num && j > 0;j--)
// for(initialization; test-condition; updation)
The test condition is false in the first iteration because you have initialized j to num and you are now checking if j < num which is false. Hence, it never goes into this loop.
Similarly, in the second case:
for (int j = num;j > num;j++)
you have initialized j to num and are now checking if j > num which is obviously false. Hence, the content of this loop is also never executed.
You can correct these by changing the initialization part in both the for loops (as suggested by #zenwraight):
for(int j = num-1; j > 0; j--) // first case
for(int j = num+1; ; j++) // second case

java - Input 2 integer arrays and print alternating elements

Conditions:
both arrays must be in order or error message
the first array must be as long as or longer than the second or error message
if the first is longer than the second it must continue to print the first
Example: given setF[] = 1,2,3,4,8 and setS[] =5,6,7 it prints 1, 5, 2, 6, 3, 7, 4, 8
The Problem With My Code: It will print and alternate fine, but will not continue to print the first areay if it's longer.
full code (I apologize for slightly messy formatting. The website screwed it up a little bit):
package mergearrays;
import java.io.*;
import java.lang.*;
import java.util.*;
public class MergeArrays {
public static void main(String[] args) {
//variables
boolean done = false;
boolean error = false;
int inpval = 0;
int i = 0; //will be setF.length
int j = 0; //will be setS.length
//arrays
int [] vals = new int[20000];
//ask user
System.out.println("Enter the values for the first array, up to 10000 values, enter zero or a negative number to quit");
//input array
Scanner scan = new Scanner(System.in);
while(!done) {
inpval = scan.nextInt();
if (inpval > 0) {
vals[i] = inpval;
i++;
}
else {
done = true;
}
}
done = false;
System.out.println("Enter the values for the second array, up to 10000 values, enter zero or a negative number to quit");
while(!done) {
inpval = scan.nextInt();
if (inpval > 0) {
vals[j+i+1] = inpval;
j++;
}
else {
done = true;
}
}
//new arrays
int [] setF = new int[10000];
int [] setS = new int[10000];
//copy vals into setF and setS
System.arraycopy(vals, 0, setF, 0, i);
System.arraycopy(vals, i+1, setS, 0, i+j+1);
//check for order
for (int p = 0; p < i - 1; p++) {
if (setF[p] > setF[p+1]) {
error = true;
break;
}
}
for (int b = 0; b < j - 1; b++) {
if (setS[b] > setS[b+1]) {
error = true;
break;
}
}
//print first array
System.out.print("\n First Array: ");
for(int q = 0; q < i; q++) {
System.out.print(setF[q] + " ");
}
//print second array
System.out.print("\n Second Array: ");
for(int m = 0; m < j; m++) {
System.out.print(setS[m] + " ");
}
//print the final set
if(i >= j && error == false){
System.out.print("\n Merged Array: ");
for(int n = 0; n <= i+j; n++) {
if(setF[n] != 0 && setS[n] !=0) {
if(n <= j) {
System.out.print(setF[n] + " ");
System.out.print(setS[n] + " ");
}
else if(n > j && n <= i){
System.out.print(setF[n] + " ");
}
}
}
}
//error message
else {
System.out.print("\n ERROR: Array not in correct order");
}
}
}
the reason it didn't continue to print for you if the first array is longer lies in this line of code:
if (setF[n] != 0 && setS[n] != 0) {
You continued to print only if both of the array at the same position were zero. You should check here 'OR' not 'AND'. In addition, after changing that condition to 'OR', the ifs inside need to be changed as well, because the indexes are not correct. As follows:
System.out.print("\n Merged Array: ");
for (int n = 0; n <= i + j; n++) {
if (setF[n] != 0 || setS[n] != 0) {
if (n < j) {
System.out.print(setF[n] + " ");
System.out.print(setS[n] + " ");
} else if (n < i) {
System.out.print(setF[n] + " ");
}
}
}
I would have solved it in a different way, and I can guide you to if you need some help. Anyways, Hope this helps...

Is the number prime - SPOJ - error " runtime error (NZEC)"

I'm doing the program for SPOJ.com taks which should recognize Prime number. Unfortunately this SPOJ taks is in Polish language, hence I will try to translate what should be the input and outpu expectation:
Input:
n - the number of tests n <100000, in the next lines n numbers from the interval [1..10000]
Output:
For each number of the word "YES", if this number is prime. Word: "NO", otherwise.
Example:
Input:
3
11
1
4
Output:
YES
YES
NO
I wrote following code whcih during the test works perfectly fine. Unfortunately when I'm trying to submit this code on SPOJ webpage it is constantly returning me error "
runtime error (NZEC)" Can someone advise how I can improve it?
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if(1<=n&& n<=100000){
for(int i = 0; i<n+1; i++){
int v = in.nextInt();
if(1<=v&&v<=10000){
if(isPrime(v) == true){
System.out.println("YES");
}
if(isPrime(v) == false){
System.out.println("NO");
}
}
}
}
}
private static boolean isPrime(int v) {
if (v < 2) return true;
if (v == 2) return true;
if (v % 2 == 0) return false;
for (int i = 3; i * i <= v; i += 2)
if (v % i == 0) return false;
return true;
}
Have you learnt Sieve Method for Prime numbers.
Check here you will find the better solution.
public class PrimeSieve {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
// initially assume all integers are prime
boolean[] isPrime = new boolean[n+1];
for (int i = 2; i <= n; i++) {
isPrime[i] = true;
}
// mark non-primes <= n using Sieve of Eratosthenes
for (int factor = 2; factor*factor <= n; factor++) {
// if factor is prime, then mark multiples of factor as nonprime
// suffices to consider mutiples factor, factor+1, ..., n/factor
if (isPrime[factor]) {
for (int j = factor; factor*j <= n; j++) {
isPrime[factor*j] = false;
}
}
}
// count primes
int primes = 0;
for (int i = 2; i <= n; i++) {
if (isPrime[n]) primes++;
}
System.out.println("The number of primes <= " + n + " is " + primes);
}
}
You should check all numbers from 2 to n, to see if the number isPrime or not.
Code
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i = 0; i < n ; i++) {
int v = in.nextInt();
if (v >= 1 && v < 10000) {
if (isPrime(v) == true) {
System.out.println("YES");
}
if (isPrime(v) == false) {
System.out.println("NO");
}
}
}
}
private static boolean isPrime(int v) {
for(int i=2;i<v;i++) {
if(v%i==0)
return false;
}
return true;
}
}
I hope this helps you.

isItPrime using a boolean method? So Close

I feel I am so close! The output is just outputting true true true or false false false (depending on the length of the array and the user inputs.
I feel this is because of the if/else! For instance, if the number you input first is either true or false it makes all of them that!?
This is supposed to print to the console the numbers in the array, the index of the array numbers, and whether they are prime or not, individually.
Thanks for the help!!
import java.util.Scanner;
import java.util.Arrays;
public class isItPrime {
//main method
public static void main (String[] args) {
//Scanner
Scanner input = new Scanner(System.in);
System.out.println("Enter length of array: ");
int n = input.nextInt();
int[] numbers = new int[n];
System.out.println("Enter " + n +" integers to fill the array: ");
for(int i=0; i<n; i++){
numbers[i] = input.nextInt();
}
System.out.println(Arrays.toString(numbers));
for(int j=0; j<n; j++){
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(numbers));
}
}
public static boolean isPrime(int[] numbers){
boolean Prime = true; //initial boolean value
for (int i = 2; i<numbers.length; i++) {
for (int j=0; j<numbers.length; j++) {
if (numbers[j] == 1 || numbers[j] == 0) {
Prime = false;
}
else if (numbers[j]%i==0){ //function which determines if an int is prime.
Prime = false;
}
else {
Prime = true;
}
}
}
return Prime;
}
}
This is what you need:
public class IsItPrime{
//main method
public static void main(String[] args) {
//Scanner
Scanner input = new Scanner(System.in);
System.out.println("Enter length of array: ");
int n = input.nextInt();
int[] numbers = new int[n];
System.out.println("Enter " + n + " integers to fill the array: ");
for (int i = 0; i < n; i++) {
numbers[i] = input.nextInt();
}
System.out.println(Arrays.toString(numbers));
for (int j = 0; j < n; j++) {
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(numbers[j]));
}
}
public static boolean isPrime(int numbers) {
boolean Prime = true;
if (numbers == 1 || numbers == 0) {
Prime = false;
return Prime;
}
for (int i = 2; i < numbers; i++) {
if (numbers % i == 0) {
Prime = false;
return Prime;
} else {
Prime = true;
}
}
return Prime;
}
}
Only a single integer needs to be passed to the isPrime function.
Also, for processing this integer only a single loop would suffice in the isPrime function.
I have made the required changes.
Assuming you want to return which elements are prime:
public static boolean isPrime(int[] numbers){
boolean prime[] = new boolean[numbers.length]; //initial boolean value
for (int i = 0; i<numbers.length; i++) {
for (int j=2; j<=sqrt(numbers[i]); j++) {
if (numbers[j]%i==0){ //function which determines if an int is prime.
prime[i] = false;
continue;
}
}
prime[i] = true
}
return prime;
}
I'm creating a prime array and whichever is prime, I'm making its position in the array true, and i continue with the next element.
Also, for prime, you have to check until square root of the number for the sake of efficiency.
For example, if you want to check if 10 is prime, it is better to iterate until sqrt(10)=3.2.
Your biggest problem is your isPrime() method should calculate if a particular number is prime, not analyse an array of numbers.
Try this:
public static boolean isPrime(int number){
// return true if prime
}
And call it like this:
System.out.println(numbers[j] + ": " + j + " -- " + isPrime(number[j]));
Altered method to return string i.e, "Prime" or "Not Prime".
public static String isPrime(int numbers) {
if (numbers == 1 || numbers == 0) {
return "Not Prime";
}
for (int i = 2; i < numbers; i++) {
if (numbers % i == 0) {
return "Not Prime";
}
}
return "Prime";
}

Categories

Resources