【问题标题】:Why is output not showing the Prime Numbers on the Display?为什么输出没有在显示屏上显示素数?
【发布时间】:2015-10-28 02:06:22
【问题描述】:

我一直在为我的入门 Java 课程编写这个程序,基本上,它应该提示用户选择是否显示素数 (1-1000)、梅森素数 (1-10000)、或费马素数 (1-1000)。我终于让它运行了,但是当我选择 3 或 4(显示 mersenne 或 fermat)时,什么都没有显示,但程序仍在运行。对于梅森素数,它应该显示数字 3、7、31、127 和 8191。对于费马素数,它应该显示数字 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

【问题讨论】:

  • 在使用 3 或 4 个输入值执行问题的整个过程中,检查调试器中 displayFermat 的值。
  • 如果您将代码缩减为专注于单个输入,这将是一个更好的问题。你的意思是输入 2 或 3,而不是 3 或 4。
  • 尝试删除';'在while (number &lt;= (long)(Math.pow(2, number)) - 1);while (number &lt;= (long)(Math.pow(2, Math.pow(2, number))) - 1); 之后

标签: java math methods primes


【解决方案1】:

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

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

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

如果您以number = 1 开头,您将拥有1 &lt;= 1,这是真的,您进入循环。在下一次迭代中你有number = 2,所以循环检查将是2 &lt;= 3,所以它是真的。如果你这样继续下去,第二项每次迭代都会变大,你永远不会退出循环。

根据Wikipedia

梅森素数是一个小于二的幂的素数。也就是说,它是一个素数,对于某个整数 n,它可以写成 Mn = 2^n − 1 的形式

因此,输入数字必须等于任意 2 负 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;
    }
} 

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

【讨论】:

    【解决方案2】:

    你可以试试关注吗?

    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;
        }
    

    【讨论】:

    • 你能解释一下这是做什么的吗?为什么?您是在纠正 OP 代码中的错误,还是只是复制您的工作代码并将其粘贴到此处?从长远来看,后者对 OP 帮助不大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2021-10-09
    • 2023-02-03
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多