【问题标题】:Non-deterministic output of simple C program简单 C 程序的非确定性输出
【发布时间】:2021-12-26 10:03:19
【问题描述】:

这是我为学习 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”

【问题讨论】:

  • _Bool compositePrimeNumbers[n]; 对于不是initialPrimeIterator (i += initialPrimeIterator) 倍数的数字未初始化。
  • 请不要在代码中包含行号。如果您想指出特定行,请在问题本身中提及它并在该行上添加评论。
  • 其他一些不相关的点:&lt;stdbool.h&gt; 标头定义了 bool 类型。在使用argv 中的任何元素之前,您应该始终检查argc
  • 这应该是一次寻宝,还是您认为您可以提供输出令人惊讶的输入?
  • 您可能想向rubber duck 或合适的替代者(室友、朋友等)解释您的第一个循环。它所做的只是将所有奇数索引标记为true

标签: c output primes non-deterministic


【解决方案1】:

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

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

(其实这可以通过将2 * initialPrimeIterator替换为initialPrimeIterator * initialPrimeIterator来优化)。

通过这些更改,我相信您正在顺利完成该计划。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我试过了,仍然得到相同的非确定性输出
    • “可能出于性能原因”:您可以去掉“可能”一词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多