【问题标题】:return issues in javajava中的返回问题
【发布时间】:2016-12-20 16:15:28
【问题描述】:

所以我正在为 java 中的 codeeval 编写一个 mersense 脚本来练习该语言(我对它相当陌生)。在某一时刻,我正在检查数字是否为素数,并在我的方法中进行正常检查,一切看起来都很棒

public static boolean isPrime (int testValue){
  if (testValue < 4){
    return true;
  } else if (testValue % 2 == 0){
    return false; 
  } else {
    for (int I = 1; I < Math.sqrt (testValue); I++){
      if (testValue % I == 0 ){
         return false; 
     }
   }
   return true;
  }
}

然而,唯一通过的事情似乎是 1 和 3。我不能在 for 循环之后返回,这是怎么回事?有什么想法吗?

编辑:

这里是完整的代码:

import java.io.*;
import java.lang.Math;

public class Main{
public static void main(String[] args) throws IOException {
    File file = new File(args[0]);
    BufferedReader buffer = new BufferedReader(new FileReader(file));
    String line;
    int n;
    StringBuilder result = new StringBuilder();
    int candidate;
    while((line = buffer.readLine()) != null){
        n = Integer.parseInt(line.trim());
        for(int i = 1; i < n; i++){
            candidate = mersenne(i);
            if(isPrime(candidate)){
                System.out.println(candidate + " "+ isPrime(candidate));
                if((i+1) >= n){
                    result.append(candidate);
                }else{
                    result.append(candidate + ", ");
                }
            }
        }
        System.out.println(result.toString());
        result = new StringBuilder();
    }
}

public static int mersenne (int testValue){
    return (int)Math.pow(2,testValue) - 1;
}
public static boolean isPrime(int testValue){
    if(testValue < 4 && testValue > 1){
        return true;
    }else if(testValue % 2 == 0){
        return false;
    }else{
        for(int i = 3; i <= Math.sqrt(testValue); i++){
            if(testValue % i == 0){
                return false;
            }
        }
        return true;
    }
}
}

【问题讨论】:

  • 你所说的“唯一能通过的东西”是什么意思?如,n 以上 3 为 isPrime(n) 返回 false?
  • testValue % 1 == 0 始终为真。使用调试器很容易发现这种错误。
  • 除此之外:按照惯例,您通常在for 循环中使用小写的i
  • 您还可以通过删除所有elses 使代码更简洁。当 if 语句块总是以 return 结尾时,控制权立即返回到调用代码,之后不会执行任何操作(finally 块除外)。所以else 是不必要的,它只会使代码更难阅读(尤其是没有适当的缩进)。
  • @discipline 是的,看来我得到的任何输入的唯一输出是 1,3,如果有帮助,我还添加了整个类

标签: java return conditional


【解决方案1】:

你在 else 块中的代码:

for (int I = 1; I < Math.sqrt (testValue); I++){
      if (testValue % I == 0 ){
         return false; 
     }
   }

你应该从 I=3 开始:

for (int I = 3; I < Math.sqrt (testValue); I++)

由于每个数字 %1 都等于 0,所以会返回 false。

【讨论】:

  • 是的,上面已经向我指出了这一点。有点愚蠢,我错过了。
【解决方案2】:

您从 1 开始循环。所有 %1 都是 0。从 3 开始。

【讨论】:

  • .. 并以 2 为增量,您不需要检查偶数。也应该是i &lt;= Math.sqrt(testValue)
  • 对于 3 的倍数,您确实需要从 3 开始。
  • 你说得对,我看错了变量。
  • 是的,我应该从 3 开始,@PeterLawrey 的好电话我忘了增加偶数仍然无法解释为什么任何高于 3 的数字似乎都没有通过,这让我发疯了。
  • @tourn171 答案已经解释了这一点。 5 % 1 == 0, 6 % 1 == 0, 7 % 1 == 0, 8 % 1 == 0 等等。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2017-04-16
  • 2011-06-27
  • 2011-05-10
相关资源
最近更新 更多