Ben O'Donnell
Ben O'Donnell

Reputation: 9

Java - Displaying Palindromic Primes

For my Java class, we have to write a program that displays all palindromic primes based on a number the user inputs. There are a couple other questions like this, but I need to do it without creating an array, or just typing in all of the palindromic primes.

My program works, and displays all primes, but the problem is that it displays ALL primes, not just the palindromic ones. I don't know where the error is, but I would appreciate any help I can get!

Thanks, Ben

import java.util.Scanner;

public class PalindromePrimes {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int startingPoint = 1;
        int startingPrime = 2;
        final int printPerLine = 10;

        IsItPrime(startingPrime);
        IsItPalin(startingPrime);

        System.out.println("Please Enter a Number: ");
        int n = in.nextInt();

        while (startingPoint <= n)
            { 
                if (IsItPrime(startingPrime) && IsItPalin(startingPrime)) {
                    System.out.print(startingPrime + " ");

                    if (startingPoint % printPerLine == 0) 

                        System.out.println();

                        startingPoint++;
                }

                startingPrime++;
        }
    }

    public static boolean IsItPrime(int sPrime) {

        if (sPrime == 2) {
            return true;
        }

        for(int i = 2; 2 * i < sPrime; i++) {
            if(sPrime % i == 0){
                return false;
            }

            }

            return true;
    }

    public static boolean IsItPalin(int sPrime) {

        int p;
        int reverse = 0;

        while (sPrime > 0) {
            p = sPrime % 10;
            reverse = reverse * 10 + p;
            sPrime = sPrime / 10;
        }

        if (sPrime == reverse) {
            return false;
        }

        return true;
    }      
}

Upvotes: 1

Views: 5680

Answers (4)

NetVipeC
NetVipeC

Reputation: 4432

You could really improve both functions:

Some notes about IsItPrime:

  • Check first only for even numbers (you are doing this)
  • The for-loop could begin in 3 and increment by 2, to check only odd numbers, the even are checked in the previous point.
  • The for-loop only needs to check from 3 .. sqrt(N) + 1, if the number is not prime. It would be a prime if the number is less or equal to sqrt(N) and devides N.

Function IsItPrime improve:

public static boolean IsItPrime(int sPrime) {
    if (sPrime % 2 == 0 && sPrime != 2) {
        return false;
    }

    int sqrtPrime = (int)Math.sqrt(sPrime);
    for (int i = 3; i <= sqrtPrime; i += 2) {
        if (sPrime % i == 0) {
            return false;
        }
    }

    return true;
}

Some notes about IsItPalin:

  • The return result is swapped, when sPrime == reverse is palindrome, you must return true, not false.
  • The other problem is that in the function you are modifying the parameter sPrime in the while-loop, you need to save the original value for comparing in sPrime == reverse.

Function IsItPalin improved:

public static boolean IsItPalin(int sPrime) {
    int sPrimeBackup = sPrime;
    int reverse = 0;

    while (sPrime > 0) {
        reverse = reverse * 10 + sPrime % 10;
        sPrime = sPrime / 10;
    }

    return (sPrimeBackup == reverse);
}

Upvotes: 2

Dan Rothman
Dan Rothman

Reputation: 169

This solution doesn't involve a loop, so it's probably faster

public static boolean isPaladrome(int mNumber) {
    String numToString = String.valueOf(mNumber);
    int sLength = numToString.length();
    int midPoint = sLength / 2;
    return (new StringBuilder(numToString.substring(0, midPoint)).reverse()
            .toString()).equals(numToString.substring(sLength - midPoint));
}

Upvotes: 0

Michael0x2a
Michael0x2a

Reputation: 64188

It looks like the problem is with your IsItPalin method. It's almost right, except for two problems.

The first problem is this:

if (sPrime == reverse) {
    return false;
}

return true;

Whenever your prime number is equal to the reverse, you're returning false! This is the opposite of what we want.

The fix is to switch "true" and "false":

if (sPrime == reverse) {
    return true;
}

return false;

We can actually simplify this into a single line:

return sPrime == reverse;

The second problem is with sPrime. Within your while loop, you're decreasing sPrime, and will only exit the loop when sPrime is equal to zero. That means that the only time sPrime will be equal to reverse is when you input the value of 0. To fix this, make a copy of sPrime at the top of the method and compare the copy to reverse.

The fixed version would look like this:

public static boolean IsItPalin(int sPrime) {
    int copy = sPrime;
    int reverse = 0;

    while (sPrime > 0) {
        int p = sPrime % 10;
        reverse = reverse * 10 + p;
        sPrime = sPrime / 10;
    }

    return copy == reverse;
}      

Upvotes: 1

Loathing
Loathing

Reputation: 5266

The problem is in the IsItPalin method. You are changing the value of sPrime, but then comparing sPrime to reverse. Make a copy of sPrime and compare the copy to reverse. Also, you should return true if they are equal, not false.

Upvotes: 1

Related Questions