为什么我的程序在前10个回文数字后没有继续?还有为什么我的isPrime方法对数字4不返回false



我不知道为什么我的ct没有一直到100,尽管我明确地将其设置为一直到100。

public class PalindromicPrime
{
   public static void main(String [] args)
   {     

        int ct = 0;
          while(ct < 100)
          {
             if(isPalindrome(ct) && isPrime(ct))
             {
                if(ct % 10 != 0)
                {
                   System.out.print(ct + " ");
                }
                else
                {
                   System.out.print("n");
                }
             }
             ct++;
          }
       public static boolean isPalindrome(int p) 
       {
          int palindrome = p;
          int reverse = 0;
          while (palindrome != 0) 
          {
             int remainder = palindrome % 10;
             reverse = reverse * 10 + remainder;
             palindrome = palindrome / 10;
          }
          if (p == reverse) 
          {
             return true;
          }
            return false;
       }

我假设我的isPrime代码是错误的,因为我的输出中有一个4。这种方法有什么问题?

       public static boolean isPrime(int p)
       {
          for(int i = 2; i < p/2; i++)
          {
             if(p % i == 0)
             {
                return false;
             }
          }
          return true;
       }
}

在方法isPrime()中应该做的第一个更改是更改这一行

for(int i = 2; i < p/2; i++)

for(int i = 2; i <= p/2; i++) // you can easily find the reason why it is necessary(=)

而且您打印的是小于100的素数回文数,而不是前100个回文数。如果您想打印前100个复文数,您可以使用另一个计数器来跟踪打印的数字。

你可以这样修改你的主要方法:

public static void main(String [] args)
   {     
        int ct = 0,n=0; // n to count numbers printed/found
          while(n < 100) // change the condition to check n<100
          {
             if(isPalindrome(ct) && isPrime(ct))
             {
                System.out.print(ct + " ");
                if(n % 10 == 0)
                {
                   System.out.println();
                }
                n++; // incementing n after a number is found!
             }
             ct++;
          }
    }

您的回文方法很好。这是你的isPrime方法不起作用,因为要检查一个数字是否是素数,你应该测试该数字的平方根。因此,只要简单地改变一下条件就可以了,

public static boolean isPrime(int p)
       {
          for(int i = 2; i <= Math.sqrt(p); i++)
          {
             if(p % i == 0)
             {
                return false;
             }
          }
          return true;
       }
}

将您的isPrime函数更改为以下内容(将<替换为<=,因为4/2是2,对于p=4,循环根本不会运行):

public static boolean isPrime(int p) {
    for (int i = 2; i <= p / 2; i++) {
        if (p % i == 0) {
            return false;
        }
    }
    return true;
}
public static void main(String[] args) {
    int ct = 2;
    int count = -1;
    while (count < 99) {
        if (isPalindrome(ct) && isPrime(ct)) {
            count++;
            if (count % 10 == 0) {
                System.out.print("n" );
            }   
                System.out.print(ct + " ");
        }
        ct++;
    }
}

唯一的回文和素数且小于100的数字是:

1 2 3 5 7 11

尝试将值100更改为102。然后你得到以下输出,因为101是11之后的下一个回文素数:

1 2 3 5 7 11 101 

最新更新