显示回文素数

时间:2019-02-28 22:03:53

标签: java methods palindrome

我正在尝试制作一个程序,以显示每行10个数字的前50个主要回文。这是我到目前为止的代码,但是运行时什么也没发生。我已经看过类似的解决方案,但似乎找不到错误所在。任何帮助将不胜感激。

 import java.lang.Math;
public class PalindromicPrime {
    public static void main(String[] args) {
        int counter = 1;
        int start = 2;      

        isPalindrome(start);
        isPrime(start);

        while (counter <= 50) {
            if (isPrime(start) && isPalindrome(start)) {
                System.out.print(start + " ");
                if (counter % 10 == 0) {
                    System.out.println();
                    counter++;
                }
                start++;
            }
        }
    }
    public static boolean isPalindrome(int x) {
        int reverse = 0;
        while(x > 0) {
        reverse = reverse * 10 + x % 10;
        x = x / 10;
        }
        if (reverse == x) {
            return true;
        }
        else {
            return false;
        }       
    }
    public static boolean isPrime(int x) {
        if (x % 2 == 0 && x != 2) {
            return false;
        }

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

}

3 个答案:

答案 0 :(得分:1)

  1. 当{<1>}不是素数时,您不会递增start,因此当您遇到第一个非素数时,就会遇到无限循环。将start++放在if语句之外。

  2. 您的isPalindrome()方法已损坏。将变量x缩减为创建reverse,然后将reversex的修改版本而不是其原始值进行比较。

  3. 您仅每10个素数增加一次counter,因此最终将打印500个回文素数,而不是50个。

奖金:如果存储找到的每个素数,然后仅检查按先前找到的素数进行查找,则查找素数的速度更快。

答案 1 :(得分:0)

您的代码是一个无限循环。这是因为您在if语句中增加了start,所以仅当start是素数和回文数时。 如果start不是回文或素数,它将不会输入条件,因此counter的Neversincréée将达到50

答案 2 :(得分:0)

首先,正如其他人所说,您的isPalindrome()方法无法正常工作。
我建议您将int转换为字符串,然后检查是否为回文式。我认为这是最简单的方法。也许其他人可以在性能方面发表评论。
这是我的处理方式:

public static boolean isPalin(int x) {
    String s = Integer.toString(x);
    for(int i = 0; i < s.length()/2; i++) {
        if(s.charAt(i) != s.charAt(s.length()-i-1)) {
            return false;
        }
    }
    return true;
}

另外,您的while循环无法正常工作,因为您仅在实际发现质数时才递增启动。每当您发现素数时,计数器都应增加。
最重要的是,您应该将while循环的条件基于起始值,而不是换行符的计数器
编辑:实际上,您应该在while条件下使用counter。我错了。

这是更新的代码:

public static void main(String[] args) {
    int counter = 0;  
    int start = 2;
    while (counter < 50) {
        if (isPrime(start) && isPalin(start)) {
            System.out.print(start + " ");
            counter++;
            if (counter % 10 == 0) {
                System.out.println();
            }
        }
        start++;
    }
}

public static boolean isPalin(int x) {
    String s = Integer.toString(x);
    for(int i = 0; i < s.length()/2; i++) {
        if(s.charAt(i) != s.charAt(s.length()-i-1)) {
            return false;
        }
    }
    return true;
}
public static boolean isPrime(int x) {
    if (x % 2 == 0 && x != 2) {
        return false;
    }

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

以下是回文的前50个素数的输出:

2 3 5 7 11 101 131 151 181 191 
313 353 373 383 727 757 787 797 919 929 
10301 10501 10601 11311 11411 12421 12721 12821 13331 13831 
13931 14341 14741 15451 15551 16061 16361 16561 16661 17471 
17971 18181 18481 19391 19891 19991 30103 30203 30403 30703