Problem:
An emirp (prime spelled backward) is a nonpalindromic prime number whose reversal is also a prime. For example, 17 is a prime and 71 is a prime. So, 17 and 71 are emirps. Write a program that displays the first 100 emirps. Display 10 numbers per line and align the numbers properly. as follows:
Output:

Solution:
//Happy note: based on our input, it's okay if we duplicate //palindromes, i.e. we can have both 17 and 71 among the 100 //that means we have to code less than we would've if it //only wanted sets of palindromes import java.util.Scanner; public class Emirp { //To make things easier, let's just make //a method to determine if a number is a //prime or not instead of copying the code //into our loops public static boolean isPrime(int N) { //Here's a trick about numbers and their divisors: //We all know that a number like a number n can have //as finite divisors 1, itself, and any number between //1 and n that divides n withou a remainder. //To find out if a number n has a divisor greater than 1 //and less than itself (i.e., not prime) we can go throu //every number between 1 and n and check if we find at least //one divisor. But a shortcut to that is to check every //number between 1 and n squared. For some reason //this is a valid math theorem, so just work with it //cz it'll involve less looping :) for(int i =2;i<=Math.sqrt(N);i++) { if(N%i==0) { //Of course if we found out that it does //divide n, then it is not prime so we should //stop this method automatically return false; } } //And if we found nothing between 1 and n squared //then n truly is a prime return true; } //Just like we did with primeness //let's make a method for palindromes //to save us time //All we need to input is the number itself public static int reverse (int N) { String str = Integer.toString(N); String targetS = ""; { for(int i =str.length()-1;i>=0;i--) { targetS+= str.charAt(i); } } return Integer.parseInt(targetS); } //Note: we want to get a NON-palindrome prime, //the best way to do this is to first check if //a number is a prime and then seeing if it IS //a palindrome. It's easier to make a method that //shows that it's prime than the converse. //There are two common ways of testing palindromes //One is comparing and looping between each side of a word //through variables left and right, and the other method //is to create a string that has the reverse of our word //and comparing it with the original to see if the original //string is the same as its reverse //We'll use the second technique here just for convenience //and first try to find the reversed form //Note: we could've integrated this with the next palindrome method //but it's just always more neater to work with sets of methods //instead of just one method public static int reverse (int N) { //However, to reverse the digits in a int //we have to convert it into a String //so that we can treat it like a set of characters String str = Integer.toString(N); //Note: we can't remove things from a string variable //but just add, so we have to make a new empty String and add //to it the characters of our original string but in reverse String targetS = ""; //Since we're to reverse the original String //then we have to start from the last index/character //and make ourselves go to the left, while adding everything for(int i =str.length()-1;i>=0;i--) { targetS+= str.charAt(i); } //Since we want to return an int (cz we are working with //numbers) then we have to convert our reversed String //into an int variable with the following method: return Integer.parseInt(targetS); } //The reverse and prime methods are useless if there's no method //that will use them to see if is prime AND a palindrome //or not, so it's time for: public static boolean isPalindromicPrime(int N) { //As expected, we need to convert to string String S = Integer.toString(N); if (isPrime(N)) { //Note: to convert a int or anything into a String, we can //either use a method (Integer.toString(N), etc) or just append //our int to ""; both techniques work if(N.equalsIgnorecase(""+reverse(N)) return true } else return false; } //Time to see if our N is prime, not a palindrome, //but has a prime number as a reversal public static boolean isEmirp(int N) { String S = Integer.toString(N); //Hint: always separate conditions with () in case you have //a condition that uses operators just to be safe/clear if (isPrime(N) && isPrime(reverse(N)) && (isPalindromicPrime(N) == false)) return true; else return false; } //God... that was a lot, but we need our 100 public static void main (String[] args) { //We want the first 100 emirps so lets make an array //to store them int[] pprime = new int[100]; //We need something to count how many emirps we've found int count =0; //And now it's time to loop over every number above 2 to //find our emirps and store them till we reach the 100 count for (int pal =2;count<100;pal++) { if (isEmirp(pal)) { pprime[count] = pal; count++; } } //...We still gotta print out our 100 emirps for(int i =0;i<100;i++) { //Well, we need to make it look like a table and //a table needs to have an ending and we need to start //a new line after every 10th emirp if ((i+1) % 10 == 0) System.out.println(pprime[i]); else System.out.print(pprime[i] + "\t"); } } }
on line 113, when I compile this code I get the error "int cannot be dereferenced". How does this get resolved properly?
ReplyDelete