打印不超过 n 的质数

Printing prime numbers up to n

我写了一些代码来要求用户输入 n,然后打印直到 n 的质数。然而,当我使用它时,即使用 10,它只打印非质数

 /* Asks for the amount of prime numbers you would like to print, then prints them */

#include <stdio.h>

int main(void)
{
    int n, i, j, check;
    printf("How many prime numbers would you like to print? ");
    scanf("%d", &n);

    for (i = 2; i <= n; i++) {
        check = 0;

        for (j = 2; j < i ; j++) { 
            if (i % j == 0) {
                check = 1;              
                if (check == 1) {
                    printf("%d\n", i);
                }
            }
        }
    }       

    return 0;
}

How many prime numbers would you like to print? 10
4
6
6
8
8
9
10
10

我已经尝试了所有方法,但我认为我遗漏了一些非常微不足道的东西!

应该是这样的:

for (i = 2; i <= n; i++)
{
    check = 0;

    for (j = 2; j < i ; j++)
    {

        if (i % j == 0)
        {
            check = 1;
            break;
        }
    }
    if (check == 0)
    {
        printf("%d\n", i);
    }
}

此外,在内部循环中,您不必将数字除以 j < i。您不必超出 i/2.

正如 Weather Vane 所说,mod 运算符 % returns 0 如果 i 可以被 j 整除,如果这是真的那么数字是 不是 素数。你的条件语句是倒退的。

#include <stdio.h>
int main(void)
{
   int n, i, j, check;
   printf("How many prime numbers would you like to print? ");
   scanf("%d", &n);

   for (i = 2; i <= n; i++) 
   {
       check = 0;
       for (j = 2; j < i ; j++) 
       { 
           if (i % j == 0) 
           {
               check = 1;
               break;
           }
       }
       if (check == 0)
       {
           printf("%d\n", i);
       }
   }

   return 0;
}

How many prime numbers would you like to print? 10
2
3
5
7

几个问题。

首先,当你设置check = 1时,这意味着i平均分配,所以n不是素数,所以你应该'打印它。您应该在 check == 0.

时打印数字

其次,您每次都通过内部循环进行打印。您应该在循环结束时测试 check,以确保 none 的数字除以它。

作为一项改进,一旦找到一个整除数,就无需继续检查。这样一设置check = 1.

就可以跳出内循环
#include <stdio.h>

int main(void)
{
    int n, i, j, check;
    printf("How many prime numbers would you like to print? ");
    scanf("%d", &n);

    for (i = 2; i <= n; i++) {
        check = 0;

        for (j = 2; j < i ; j++) { 
            if (i % j == 0) {
                check = 1;
                break;
            }
        }
        if (check == 0) {
            printf("%d\n", i);
        }
    }       

    return 0;
}

尝试查看此代码

#include <stdio.h>

int IsPrime(int num)
{
    int i = 2;

    for (i = 2; i < num; i++) if (num % i == 0) return 0;

    return 1;
}

int main(void)

{
    int n, i;
    char *nStr = (char*)malloc(10);

    printf("How many prime numbers would you like to print? ");
    fgets(nStr, 9, stdin);
    n = atoi(nStr);

    for (i = 1; i <= n; i++) if (IsPrime(i)) printf("%d\n", i);

    getchar();
    return 0;
}

关于您的代码,只有当支票仍为 0 时,您才应该打印数字。