-4

使用 Eclipse、Java

尝试制定检查一个数是否为素数的方法(手段可以被1和他自己分开)与否

当前创建了一些功能(下面的代码)。此代码返回所需的结果,但并非对于所有素数,意味着对于数字 33 和 55,它是 returnfalse而不是true.

代码

private static void numberCheker() throws IOException {
    System.out.println("Enter number - ");
    int number;
    number = getNumber();
    boolean result = true;
    if ((number % 2 == 0) && (number != 2)) {
        System.out.println("Not");
    } else if (number == 1) {
        System.out.println("1 not a valid number");    
    } else if (number == 2)
        System.out.println("Simple");    
    else {
        for (int i = 2; i < number + 1; i++) {
            if (number % i == 0) {
                result = false;
            } else
                result = true;
        }
        if (result = true)
            System.out.println("Simple");    
        else 
            System.out.println("not Simple");
    }
}

问题- 我在“逻辑”中犯了错误 - 花几个小时来修复 - 但不能这样做。有什么建议吗?

结果必须如下所示

Enter number - 
1
simple
Enter number - 
2
simple
Enter number - 
3
simple
Enter number - 
4
not simple
Enter number - 
5
simple

...

但我得到了

Enter number - 
33
not simple - **WRONG**
Enter number - 
55
not simple - **WRONG**

编辑:

非常感谢所有人都尝试像 Michael Konietzka 一样悲伤:

 private static boolean numberCheker() throws IOException {

    System.out.println("Enter number - ");
    int number = getNumber();

    for (int i=2;i<number;i++)
     {
        if (number%i==0) return false; 
     }
        return (number>1);

}

和 getNumber()

public static int getNumber () throws IOException{
int temp;
try{    
    BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in));
    String resultReader = bReader.readLine();
    temp =  Integer.parseInt(resultReader);
    return temp;
}
catch (NumberFormatException failDescription){
    System.out.println(failDescription);
    return 0;
}

}

现在它的工作完美感谢您的帮助!

4

8 回答 8

3

我不确定简单数字的定义是什么

但这可能是个问题

 if (result=true)

将上面更改为

 if (result)

编辑您还需要修复其他人提到的漏洞。

于 2013-02-04T20:35:40.067 回答
2
if (result=true)

我认为你的意思是双等号:

if (result==true)

当你说 if (result=true) 时,这个语句总是会返回 true。

编辑:您还需要在 for 循环中修复 if-else 内容。见我先生的回答。

于 2013-02-04T20:36:55.973 回答
2

您可以将检查放入类的静态方法中:

public static boolean isPrime(final int n)
    {
     for (int i=2;i<n;i++)
     {
        if (n%i==0) return false; 
     }
        return (n>1);
    }

您必须遍历从 2 到 n-1 的所有数字并检查 n 是否可被 i 整除而没有余数。如果是这样,该方法可以立即返回 false,因为找到了一个因素。如果在 2 和 n-1 之间没有找到因子,并且数字大于 1,则它是素数;该方法返回真。

要使用此方法,您可以以这种方式简单地使用它,例如:

public static void main (String[] args) 
  {
     for (int i=1;i<10;i++)
     {
         System.out.println(i+": "+isPrime(i));
     }

这将输出

1:错误

2:真

3:真的

4:错误

5:真的

6:错误

7:真的

8:错误

9:错误

于 2013-02-04T21:44:49.760 回答
1

问题是当你发现数字不是素数时你并没有跳出循环,要解决这个问题,只需添加,中断;在你的 if 语句之后......这里是代码:

        if (number%i==0){
            result=false;
             break;
            }

编辑

您还需要按照@Smit 的建议修复 if 语句

于 2013-02-04T20:38:25.977 回答
0

3 是素数,但 3 的倍数不是素数,5 等也是如此。素数的倍数不是素数。只有这么多的素数。没有为设计素数制定明确的规则,我怀疑你是否会这样做。素数 no 是一个不在集合 2n n 3n 中并且只能被它自己和 1 整除的数。

于 2013-02-04T20:38:05.110 回答
0

2 个问题 1 - 你需要在它为 false 时添加一个 break 2 - 最后需要更改 if

   if (result=true) 

   if (result)

public static void main(String[] args) {

        System.out.println("Enter number - ");
        int number = 55;
        boolean result = true;
        if ((number%2==0) && (number!=2) ){
            System.out.println("Not");
            }
        else if (number ==1){
            System.out.println("1 not a valid number"); 
        }
        else if (number ==2)
            System.out.println("Simple");   
        else{           
            for (int i=2; i<number;i++){
                if (number%i==0){
                    result=false;
                    break;
                    }
                else
                    result = true;

                }
            if (result)
                System.out.println("Simple");   
            else 
                System.out.println("not Simple");
        }   

    }

}
于 2013-02-04T20:42:05.827 回答
0

您的错误在循环终止中。

通过循环直到 number + 1,该数字最终将被自身除,余数为零,因此每个数字看起来都不是素数。

循环直到 number / 2 (sqrt(number) 会更有效,但代码的质量表明这不是问题)

此外,当您检测到余数为零时,您必须中断循环。

于 2013-02-04T20:49:17.610 回答
0

我建议查看一种称为埃拉托色尼筛法的算法:http ://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

这是一个创建素数列表的非常简单的算法,它将帮助您了解如何确定一个数字是否为素数。

顺便说一句 - 不要忘记排除负数!

于 2013-02-04T21:50:03.210 回答