简单 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完成程序,而只会指出您当前版本中的问题:
- 如前所述,数组
compositePrimeNumbers
未初始化。由于必须用 0
表示的所有值 false
进行初始化,因此最快的方法是:
memset(compositePrimeNumbers, 0, sizeof(compositePrimeNumbers));
- 您不应将当前
initialPrimeIterator
标记为合数,因此 for 循环应从下一个倍数开始。此外,必须包括 n
:
for (int i = 2 * initialPrimeIterator; i <= n; i += initialPrimeIterator) {
(其实可以把2 * initialPrimeIterator
换成initialPrimeIterator * initialPrimeIterator
优化一下)
通过这些更改,我相信您已经顺利完成了该计划。
这是我为学习 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完成程序,而只会指出您当前版本中的问题:
- 如前所述,数组
compositePrimeNumbers
未初始化。由于必须用0
表示的所有值false
进行初始化,因此最快的方法是:
memset(compositePrimeNumbers, 0, sizeof(compositePrimeNumbers));
- 您不应将当前
initialPrimeIterator
标记为合数,因此 for 循环应从下一个倍数开始。此外,必须包括n
:
for (int i = 2 * initialPrimeIterator; i <= n; i += initialPrimeIterator) {
(其实可以把2 * initialPrimeIterator
换成initialPrimeIterator * initialPrimeIterator
优化一下)
通过这些更改,我相信您已经顺利完成了该计划。