显示回文质数

Displaying Palindromic Prime number

我正在尝试编写一个程序来显示前 50 个素数回文,每行 10 个数字。这是我到目前为止的代码,但是当 运行 时没有任何反应。我看过类似的解决方案,但似乎无法找到错误所在。任何帮助将不胜感激。

 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;
    }

}
  1. 不是 素数时,您不会递增 start,所以当您遇到第一个非素数时,您遇到了无限循环素数。将您的 start++ 放在 if 语句之外。

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

  3. 你只在每第 10 个素数递增 counter,所以这最终会打印 500 个回文素数,而不是 50。

奖励:如果您存储找到的每个素数,然后只检查之前找到的素数的除法,则查找素数会更快。

您的代码是一个无限循环。这是因为你在 if 语句中递增 start,所以只有当 start 是质数和回文数时。 如果 start 不是回文或素数,它不会进入条件,因此 counter 将 Nevers incréée 并达到 50

首先,正如其他人所说,您的 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 条件下使用计数器。我错了。

这是更新后的代码:

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