对于我的Java类,我们必须编写一个程序,根据用户输入的数字显示所有回文素数。还有其他几个这样的问题,但是我需要在不创建数组的情况下进行,或者只需键入所有的回文素数。
我的程序工作,并显示所有素数,但问题是它显示所有素数,而不仅仅是回文素数。我不知道错误在哪里,但我很感激我能得到任何帮助!
谢谢, 本
import java.util.Scanner;
public class PalindromePrimes {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int startingPoint = 1;
int startingPrime = 2;
final int printPerLine = 10;
IsItPrime(startingPrime);
IsItPalin(startingPrime);
System.out.println("Please Enter a Number: ");
int n = in.nextInt();
while (startingPoint <= n)
{
if (IsItPrime(startingPrime) && IsItPalin(startingPrime)) {
System.out.print(startingPrime + " ");
if (startingPoint % printPerLine == 0)
System.out.println();
startingPoint++;
}
startingPrime++;
}
}
public static boolean IsItPrime(int sPrime) {
if (sPrime == 2) {
return true;
}
for(int i = 2; 2 * i < sPrime; i++) {
if(sPrime % i == 0){
return false;
}
}
return true;
}
public static boolean IsItPalin(int sPrime) {
int p;
int reverse = 0;
while (sPrime > 0) {
p = sPrime % 10;
reverse = reverse * 10 + p;
sPrime = sPrime / 10;
}
if (sPrime == reverse) {
return false;
}
return true;
}
}
答案 0 :(得分:2)
你可以真正改善这两个功能:
关于IsItPrime
的一些注意事项:
begin
并递增2,只检查奇数,偶数在前一点检查。3 .. sqrt(N) + 1
检查,如果数字不是素数。如果数字小于或等于sqrt(N)
并且不计N
,那将是一个素数。功能IsItPrime
改进:
public static boolean IsItPrime(int sPrime) {
if (sPrime % 2 == 0 && sPrime != 2) {
return false;
}
int sqrtPrime = (int)Math.sqrt(sPrime);
for (int i = 3; i <= sqrtPrime; i += 2) {
if (sPrime % i == 0) {
return false;
}
}
return true;
}
关于IsItPalin
的一些注意事项:
sPrime == reverse
为回文时,您必须返回true
,而不是false
。sPrime
的函数中,您需要保存原始值以便在sPrime == reverse
中进行比较。功能IsItPalin
改进了:
public static boolean IsItPalin(int sPrime) {
int sPrimeBackup = sPrime;
int reverse = 0;
while (sPrime > 0) {
reverse = reverse * 10 + sPrime % 10;
sPrime = sPrime / 10;
}
return (sPrimeBackup == reverse);
}
答案 1 :(得分:1)
问题出在IsItPalin方法中。您正在更改sPrime的值,但随后将sPrime与反向进行比较。复制sPrime并将副本与反向进行比较。此外,如果它们相等,则应返回true,而不是false。
答案 2 :(得分:1)
问题出在你的IsItPalin
方法上。除了两个问题外,它几乎是正确的。
第一个问题是:
if (sPrime == reverse) {
return false;
}
return true;
每当你的素数相反时,你就会返回假!这与我们想要的相反。
解决方法是切换&#34; true&#34;和&#34;假&#34;:
if (sPrime == reverse) {
return true;
}
return false;
我们实际上可以将其简化为一行:
return sPrime == reverse;
第二个问题是sPrime
。在您的while循环中,您正在减少sPrime
,并且只有在sPrime
等于零时才会退出循环。这意味着,当您输入sPrime
的值时,reverse
唯一等于0
的时间。要解决此问题,请在方法顶部复制sPrime
,并将副本与reverse
进行比较。
固定版本如下所示:
public static boolean IsItPalin(int sPrime) {
int copy = sPrime;
int reverse = 0;
while (sPrime > 0) {
int p = sPrime % 10;
reverse = reverse * 10 + p;
sPrime = sPrime / 10;
}
return copy == reverse;
}
答案 3 :(得分:0)
此解决方案不涉及循环,因此可能更快
UITextField