从 3 到 100 的数组打印质数

printing prime numbers from an array of 3 to 100

我不知道如何修复此代码以使其正常工作:

    int Numbers_Given[97];
    int n;

    for (n = 3; n <= 100; ++n) {
       Numbers_Given[n - 3] = n;
       // printf("%d ", Numbers_Given[n - 3]);
    }

    int i;

    for (n = 0; n < 97; n++) {
        for (i = 2; i < Numbers_Given[i - 2]; i++) {
            if (Numbers_Given[i - 2] % i == 0)
                break;
            else (printf("%d ", Numbers_Given[i - 2]));
        }
    }
    return 0;
}

好像只是没理解%。这是怎么回事?它一遍又一遍地打印出从 3100 的原始数组。质数没有打印出来。

存在多个问题。

  • 你的数组太小

  • 您使用 i-2 作为索引,而您应该使用 n

  • 您在检查所有 % 值之前正在打印。

试试这个:

int main()
{
    int Numbers_Given[98];  // because highest index is 100-3 = 97
    int n;


    for (n=3;n<=100;++n)
    {
       Numbers_Given[n-3]=n;
    }

    int i;

    for (n=0;n<=97;n++)
    {
        int prime = 1;  // Assume that Numbers_Given[n] is a prime

        for(i=2;i<Numbers_Given[n];i++)  // use Numbers_Given[n]
        {
            if (Numbers_Given[n]%i==0)
            {
                prime = 0;  // Not a prime so clear the flag
                break;
            }
        }
        if (prime) (printf("%d ", Numbers_Given[n]));  // Print if it's a prime
    }

    return 0;
}

顺便说一句:检查余数 (%) 时,您正在测试从 2Numbers_Given[n] - 1 的所有数字。你不需要那个,你可以早点停止(即sqrt(Numbers_Given[n])

第一个问题,正如@user3386109 指出的那样,你应该使用 n<100 而不是 n<=100 因为 Number_Given[97] 是数组本身所以最后一次迭代过去了它没有' 对输出有任何影响,但避免使用这是未来代码的一个好习惯。

这里的问题是,在内部循环中,您似乎 运行 它带有条件 i<Numbers_Given[i-2] 但问题是当您使用 [=18= 增加 i 的值时] Number_given[i-2] 的值发生变化,因此它永远不会到达终点。假设我们进行第一次迭代 i=2 然后在第一次迭代后 i++ 将其更改为 i=3 但现在 Number_given[i-2] 被称为 Number_given[1]4所以仍然 i<4 和条件遵循 所以循环 运行s 然后下一个循环 i=4 但然后 Numbers_Given[i-2] 将是 Numbers_Given[2] = 5 所以它满足条件 i<5 再一次。每个循环都一样。所以你一遍又一遍地得到数字范围。

为了解决这个从 Numbers_Given[i-2]Numbers_Given[n] 的变化,在 i 增量之后,n 独立于它,因此不会改变值并且严格条件。

此外,即使在将 Numbers_Given[i-2] 替换为 Numbers_Given[n] 之后,问题是在未能遵循“if (Numbers_Given[n]%i==0)”语句之后,else 运行s 并输出数字,但它将继续为 i 的每个值执行此操作,因此输出看起来像

3 5 5 5 7 7 7 7 7 9 11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 15 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 21 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 25 25 27 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 49 49 49 49 49 51 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 55 55 55 57 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 63 65 65 65 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 69 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 73 75 77 77 77 77 77 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 79 81 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 85 85 85 87 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 91 91 91 91 91 93 95 95 95 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 97 99 

所以为了解决这个问题,我们只需 break 我们的循环,只要它到达 else 语句,这意味着我们在第一次得到它时就得到素数,然后不再检查它。

因此最终代码将如下所示,输出 3 到 100 数组中的所有质数。

#include <stdio.h>
#include <stdbool.h>

int main()
{
    int Numbers_Given[98];
    int n;


    for (n=3;n<=100;++n)
    {
       Numbers_Given[n-3]=n;
       // printf("%d ", Numbers_Given[n-3]);
    }

int i;

    for (n=0;n<97;n++)
    {
        bool flag = 1; 
        for(i=2;i<Numbers_Given[n];i++){
            if (Numbers_Given[n]%i==0){
                flag = 0;
                break;
            }
            }
        if (flag) {
                printf("%d ", Numbers_Given[n]);
            }
    }
 return 0;
}

其输出:

3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 



P.S:- 正如其他人所说,用完整的信息提问,比如你期望什么,而不是出现什么,你得到的错误代码(如果有的话)等等,最后编辑问题以使其更容易人们来解释。

还有一点 2 也是素数,:) 只是一个附带信息。