【问题标题】:printing prime numbers from an array of 3 to 100打印从 3 到 100 的数组中的素数
【发布时间】:2021-06-07 07:47:45
【问题描述】:

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

    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 的原始数组。素数不会打印出来。

【问题讨论】:

  • 您显示的代码有什么问题?你有构建错误吗?输出错误?崩溃?还有什么?请阅读help pages,接听SO tour,阅读How to Ask,以及this question checklist。最后,请了解如何编辑您的问题以改进它们。
  • 在您的学习路径中,了解如何在代码中避免 幻数,例如 0、2、3、97、100。使用#define 定义常量的最小数量。如果您想搜索最多 250 个而不是 100 个素数,请考虑您必须在代码中更改哪些内容。使用#define,您可以使更改显而易见。
  • 从查找如何计算一个数是否为素数开始。这看起来没什么。
  • for(i=2;i&lt;Numbers_Given[i-2];i++) 是否可以引用外部循环索引n?它没有被使用,这很奇怪。
  • 一个问题,但不是 问题,是数组太小。第一个循环的最后一次迭代有n == 100,所以Given[n-3]Given[97],它在数组末尾之后。

标签: c loops primes


【解决方案1】:

有多个问题。

  • 你的数组太小了

  • 当你应该使用n时,你正在使用i-2作为索引

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

试试这个:

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])

【讨论】:

    【解决方案2】:

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

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

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

    此外,即使将 Numbers_Given[i-2] 替换为 Numbers_Given[n] 后,问题仍然是未能遵循“if (Numbers_Given[n]%i==0)”语句后 else 运行并输出数字,但它会继续这样做对于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 
    
    

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

    所以最终的代码看起来像这样,它输出从 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 也是质数,:) 只是一个侧面信息。

    【讨论】:

    • 似乎@4386427 之前在我写答案时回答了它,因为我花了更多时间来解释循环。
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多