简单 C 程序的非确定性输出

Non-deterministic output of simple C program

这是我为学习 C 而编写的一个未完成的程序(目前只检查 2 的倍数...)

最终,我希望这是埃拉托色尼筛法(素数)的实现

我遇到的问题是输出是不确定的:有时输出包括 11,有时不包括 - 少数数字会发生这种情况。我已经通过更改一些东西进行了实验,例如实际将布尔数组初始化为 false。

知道为什么会这样吗?

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

int main(int argc, char *argv[]) {
        int n = atoi(argv[1]);
        int initialPrimeIterator = 2;
        _Bool compositePrimeNumbers[n];

        printf("Prime Numbers from 2 -> %d\n", n);
        for (int i = initialPrimeIterator; i < n; i += initialPrimeIterator) {
                compositePrimeNumbers[i-1] = true;
        }
        printf("Done...\n");
        
        printf("Printing prime numbers from 2-> %d\n", n);
        for (int i = 2; i < n; i++) {
                if (!compositePrimeNumbers[i]){
                        printf("%d\n", i + 1);
                }
        }
        
        return 0;
}

编辑:哈哈。刚刚意识到我有一个名为 'compositePrime...' 的数组应该只是 'compositeNumbers'

在 C 中,本地数组未初始化,可能是出于性能原因。

解决此问题的一种方法是遍历它以将每个元素设置为 false

由于我了解到您在克服这个障碍时旨在完成程序,因此我不会post完成程序,而只会指出您当前版本中的问题:

  1. 如前所述,数组 compositePrimeNumbers 未初始化。由于必须用 0 表示的所有值 false 进行初始化,因此最快的方法是:
     memset(compositePrimeNumbers, 0, sizeof(compositePrimeNumbers));
  1. 您不应将当前 initialPrimeIterator 标记为合数,因此 for 循环应从下一个倍数开始。此外,必须包括 n
    for (int i = 2 * initialPrimeIterator; i <= n; i += initialPrimeIterator) {

(其实可以把2 * initialPrimeIterator换成initialPrimeIterator * initialPrimeIterator优化一下)

通过这些更改,我相信您已经顺利完成了该计划。