我不知道为什么我的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