Java - 显示Palindromic Primes

时间:2014-09-08 03:40:07

标签: java

对于我的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;
    }      
}

4 个答案:

答案 0 :(得分:2)

你可以真正改善这两个功能:

关于IsItPrime的一些注意事项:

  • 首先检查偶数(您正在执行此操作)
  • for循环可以在{3}中加begin并递增2,只检查奇数,偶数在前一点检查。
  • for-loop只需要从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
  • 另一个问题是,在修改while循环中参数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