为什么我的素数java程序不能打印出素数?

时间:2017-10-26 21:42:39

标签: java

static void primeNumbers(int n)
    {
         System.out.println("All the prime numbers up to "+n+" are -->\n");

        boolean isPrime = true; 
        for(int i = 2; i < n; i++)
        {
            for (int j = 1; j < i; j++)
            {
                if(i % j == 1)
                {
                    isPrime = true; 
                    System.out.print(j);
                }               

                if(i % j == 0)
                {
                    isPrime = false; 
                    System.out.print(" ");
                }
            }
        }

    }

在这段代码中,我试图列出所有素数到&#39; n&#39;这是用户输入的数字。我很困惑如何解决这个问题,以产生所有素数到n。

5 个答案:

答案 0 :(得分:1)

您想测试i是否可以被[2..i-1]范围内的任何数字分割,如果是,那么它不是素数。你的j - 循环从1开始,这是第一个错误。

知道某个数字何时可被另一个人分割,如下所示进行测试:if (i % j == 0) {(如果除数余数为零)在代码中,用1来测试相等性。

第三件事是你在第一次迭代中做出决定(当j为1时)并且总是在你的内循环中打印一些东西。你需要从内循环中取出逻辑。只有当我不能被{{1>}的任何分开时,它才是主要的。

以下是您的代码的修改版本:

j

答案 1 :(得分:0)

if (i % j == 0) {
    isPrime = false;
    System.out.print(" ");
}

对于任何i,此if语句始终为true,因为j从1开始。因此,您为每个数字打印一个空格&lt; n和&gt; = 2

此外,isPrime可能是一个不必要的变量。

答案 2 :(得分:0)

你的算法虽然很慢,但在大多数部分似乎都是正确的,除了你没有很好地处理边界条件这一事实。例如。 2是素数,你只运行迭代直到n-1,你没有为每个数字和一些小东西重置isPrime标志。这是修订后的工作版本。尝试将它与你的比较,并了解你没有做对的地方。

    int n = 10;
    System.out.println("All the prime numbers up to "+n+" are -->\n");

    boolean isPrime = true; 
    for(int i = 2; i <= n; i++)
    {
        for (int j = 2; j < i; j++)
        {   
            if(i % j == 0)
            {
                isPrime = false; 
                break;
            }
        }
        if(isPrime) {
            System.out.println(i);
        }
        isPrime = true;
    }

答案 3 :(得分:0)

在第二个for循环中不要将isPrime重新设置为true,只要数字不是一次,我们就知道它永远不是素数。只需在外循环的每次迭代中将其设置为true,并在外部进行最终的“Is prime”检查。

static void isPrime(int n)
    {
         System.out.println("All the prime numbers up to "+n+" are -->\n");

        for(int i = 2; i <= n; i++)
        {
            boolean isPrime = true;
            for (int j = 2; j < i; j++)
            {

                if(i % j == 0)
                {
                    isPrime = false;
                    System.out.println(i + " is not prime because " + i + " is divisible by " + j );
                    break;
                }
            }
            if (isPrime){
              System.out.println(i + " is prime.");
            }
        }

    }

我在这段代码中添加了几个打印件,以便您可以看到为什么逻辑的每个部分都在做它的作用 - 将它与您的代码进行比较,以便您可以理解为什么您的实际上不会搜索素数

答案 4 :(得分:-1)

我认为你的脚本中存在逻辑问题。 您应该使用一个循环计数从2到n-1的所有数字,其中=到0并带有测试

n%i = 0

如果计数器= 0则没有除法器,则为素数