为什么输出没有在显示屏上显示Prime数字?

时间:2015-10-28 02:06:23

标签: java math methods primes

我一直在为我的介绍性Java类工作这个程序,基本上,它应该提示用户选择是否显示素数(1-1000),mersenne素数(1-10000)的菜单),或费马素数(1-1000)。我终于让它运行但是当我选择3或4(显示mersenne或fermat)时,没有任何显示,但程序仍在运行。对于Mersenne Prime,它应显示数字3,7,31,127和8191.对于Fermat Prime,它应显示数字3,5,17,257。

我尝试在我的MyMath程序中重新排序算法,但仍然没有输出。

这里是算法的MyMath程序:

public class MyMath
{

    public static boolean isPrime (long number)
    {
        boolean prime = true;
        int counter = 2;

        if (number <= 1)
        {
            prime = false;
        }
        else if (number == 2)
            prime = true;
        else
        {
            while (counter <= Math.sqrt(number))
            {
                if (number % counter == 0)
                    prime = false;
                counter++;
            }
        }
        return prime;
    }

    public static boolean isMersennePrime (long number)
    {
        boolean mersenne = false;
        if (isPrime(number))
        {
            mersenne = true;
            while (number <= (long)(Math.pow(2, number)) - 1);
            {
                number++;
            }
        }
        return mersenne;
    }

    public static boolean isFermatPrime (long number)
    {
        boolean fermat = false;
        if (isPrime(number))
        {
            fermat = true;
            while (number <= (long)(Math.pow(2, Math.pow(2, number))) - 1);
            {
                number++;
            }
        }
        return fermat;
    }
}

这是MyMathTest程序,它假设从MyMath调用方法来显示数字:

import javax.swing.JOptionPane;


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

        // create menu
        String menuChoice = "1: Display the Prime Numbers 1 - 1000\n" +
        "2: Display the Mersenne Prime Numbers 1 - 10,000\n" +
        "3: Display the Fermat Primes 1 - 1000\n" +
        "4: Quit\n";

        int userInput = 0;

        // begin do while loop
        do
        {
            // display menu and prompt for input
            String numberChoice = JOptionPane.showInputDialog(null, menuChoice);
            userInput = Integer.parseInt(numberChoice);

            // begin switch statement for choices
            switch (userInput)
            {
                // case 1 displays prime number 1 to 1000
                case 1:
                String displayPrime = "The Prime Numbers from 1 through 1,000:\n";
                int outputLine = 1;

                for (int prime = 1; prime <= 1000; ++prime)
                {
                    if (MyMath.isPrime(prime)) // call isPrime method
                    {
                        displayPrime += String.format ("%d ", prime);

                        if (outputLine == 10)
                        {
                            displayPrime += "   \n";
                            outputLine = 0;
                        }
                        ++outputLine;
                    }
                }
                // display in dialog box
                JOptionPane.showMessageDialog(null, displayPrime);
                break;

                case 2:
                String displayMersenne = "The Mersenne Prime Numbers from 1 through 10,000:\n";

                for (int mersenne = 1; mersenne <= 10000; mersenne++)
                {
                    if (MyMath.isMersennePrime(mersenne))
                    {
                        displayMersenne += String.format ("%d ", mersenne);
                    }
                }
                JOptionPane.showMessageDialog(null, displayMersenne);
                break;

                case 3:
                String displayFermat = "The Fermat Prime Numbers from 1 through 1,000:\n";

                for (int fermat = 1; fermat <= 1000; fermat++)
                {
                    if (MyMath.isFermatPrime(fermat))
                    {
                        displayFermat += String.format ("%d ", fermat);
                    }
                }
                JOptionPane.showMessageDialog(null, displayFermat);
                break;

                case 4:
                break;
                default:

            } // end switch
        } while (userInput != 4);
    } // end main
} // end class MyMathTest

2 个答案:

答案 0 :(得分:1)

你的while中有一些拼写错误。你不应该';'在你的条件和开始循环代码的{之间。

除此之外,你将你的计数器和逻辑中的输入数字混合起来计算Mersenne和Fermat素数,所以你永远不会离开while循环。以梅森条件为例:

while (number <= (long)(Math.pow(2, number)) - 1)

如果你从number = 1开始,你将拥有1 <= 1,这是真的,你进入循环。在下一次迭代中,您有number = 2,因此循环检查将为2 <= 3,因此它将成立。如果你继续这样,第二个术语每次迭代都会更大,你永远不会退出循环。

根据Wikipedia

  

梅森素数是一个素数,比一个2的幂小一个。也就是说,对于某些整数n,它是一个素数,可以用Mn = 2 ^ n - 1的形式写出

因此,输入数必须等于2的任意幂-1减1.对于每个输入数,我们需要以exponent = 1开始并递增它直到结果Math.pow(2, exponent) - 1相等输入数字(然后我们知道它是一个梅森素数)或输入数字更大(然后我们知道我们走得太远了,输入不是梅森素数)。

在代码中,它会是这样的:

public static boolean isMersennePrime (long number)
{
    if (isPrime(number))
    {
        int exponent = 1;
        int powerMinusOne = (long)Math.pow(2, exponent) - 1;

        // Iterate until we reach the number 
        while (number > powerMinusOne){
            exponent++;
            powerMinusOne = (long)Math.pow(2, exponent) - 1;
        }

        // If we haven't gone over the number, it is a Mersenne prime
        return number == powerMinusOne;            
    } else {
        return false;
    }
} 

你应该做类似的事情来检查你的号码是否是费马素数。

答案 1 :(得分:0)

你能试试吗?

public static boolean isMersennePrime (long number)
{
    boolean mersenne = false;
        if (isPrime(number)) {

            int count = 2;
            while (true) {
                long check = (long) (Math.pow(2, count)) - 1;
                if (number == check) {
                    mersenne = true;
                    break;
                }
                else if (number < check)
                    break;

                count++;
            }
        }
        return mersenne;
}

public static boolean isFermatPrime(long number) {
        boolean fermat = false;
        if (isPrime(number)) {

            int count = 1;
            while (true) {
                long check = (long) (Math.pow(2, count)) + 1;
                if (number == check) {
                    fermat = true;
                    break;
                }
                else if (number < check)
                    break;

                count++;
            }
        }
        return fermat;
    }