【问题标题】:Prime Number Test always returns true [closed]素数测试总是返回 true [关闭]
【发布时间】:2014-02-26 00:53:51
【问题描述】:

所以我刚刚启动了一些 java,我试图让用户输入一个数字并测试它是否是素数。这是我的程序循环。

do{
        for(testNumber = 2; testNumber < numb; testNumber++){
            if(numb % testNumber == 0){
                test = false;
            }else{ 
                test = true;
            }
        }

        if(test = true){
            System.out.println("The number is prime.");
        }else{
            System.out.println("The number is not prime.");
        }

        System.out.println("Enter a number. Enter 0 to exit.");
        numb = number.nextInt();

    }while(numb != 0);

输入的每一个数字都会变成真的!对我来说,逻辑似乎是正确的。

【问题讨论】:

  • 这个问题已经被问过很多次了……只要找一个素数生成器,学习一下。
  • 一些建议:如果你想让它更快,设置你的循环,这样你就不会测试偶数,你只会测试直到 numb/2 向上取整。

标签: java primes


【解决方案1】:
if(test = true){

应该是

if(test == true){

第一个是“assignment”运算符,第二个是逻辑(相等测试)运算符。在official documentation 上阅读更多信息。


注意

我不会将您代码的其他部分作为您的学习练习来评论。您的代码可以优化和改进!你在正确的轨道上。继续加油!

【讨论】:

    【解决方案2】:

    首先,您使用赋值运算符=testtrue 进行比较,结果test 始终为true。已经是boolean了,直接用就不用比较了:

    if(test){
    

    其次,您将在每个 for 循环迭代中覆盖 test 的值。将其初始化为true,如果您找到一个因素,则仅将其设置为false

    test = true;
    for(testNumber = 2; testNumber < numb; testNumber++){
        if(numb % testNumber == 0){
            test = false;
        }
    }
    

    此外,您不需要测试 testNumbers 超过数字 numb 的平方根。

    int limit = (int) Math.sqrt(numb);
    for(testNumber = 2; testNumber <= limit; testNumber++){
    

    【讨论】:

    • 西部最快的枪多? :)
    • 你可能想要(int) Math.ceil(Math.sqrt(numb))。永远不知道什么时候会出现极小的下溢并截断.999999999999
    • 谢谢,删除“= true”有效。
    【解决方案3】:

    你有两个问题。首先,考虑一下您的循环逻辑:您在每次通过循环时都在积极设置test 变量。由于循环在numb - 1 结束,它几乎总是在最后一次通过时将test 设置为true。相反,在循环之前将test 设置为true,并且仅在您找到一个因素时才将其设置为false:一旦您检测到它不是素数,它就会离开它false。 (将这个循环放在一个单独的方法中,这样你就可以立即return 会更好。)

    isPrime = true;
    for(int factor = 2; factor < numb; factor++) { // see below for advice on condition
        if(numb % factor == 0)
            isPrime = false;
    }
    

    其次,您在if 语句中设置 test。您必须使用== 来检查是否相等,而在Java 中,使用if(test) 更为惯用。

    就风格而言,名为test 的变量不是很具有描述性。我建议使用上面使用的isPrime 名称。

    最后,您只需要检查到testNumber 的平方根,但不要使用浮点运算然后截断结果,否则您可能会错过一个精确的平方根因子。

    【讨论】:

    • 仅供参考,我不认为截断Math.sqrt 的结果对于int 来说是个问题,因为int 是32 位,而double 有一个52 位尾数。我刚刚进行了测试,我认为没有任何int 可能会失败。 long 可能是个问题。
    【解决方案4】:

    如果你找到它并且如果条件 == true,你应该打破

    do{
            for(testNumber = 2; testNumber < numb; testNumber++){
                if(numb % testNumber == 0){
                    test = false;
                    break;
                }else{ 
                    test = true;
                }
            }
    
            if(test == true){
                System.out.println("The number is prime.");
            }else{
                System.out.println("The number is not prime.");
            }
    
            System.out.println("Enter a number. Enter 0 to exit.");
            numb = number.nextInt();
    
        }while(numb != 0);
    

    【讨论】:

    • 似乎不起作用?我输入 4 但程序仍将其打印为素数。
    • 您在我编辑条件后尝试过吗?休息只会让你的程序更快
    • 是的,我添加了break;测试后=假;但它仍然显示 4 是素数。
    • if(test == true) not if(test = true) 这是编辑
    • 哦,抱歉,没看到。是的,它奏效了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2021-10-13
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2017-05-10
    相关资源
    最近更新 更多