我正在尝试创建一个程序,使用Sieve或Eratosthenes打印出两个数字之间的所有质数。我正在尝试遵循网站上的伪代码,但是我在第一句话上有些卡住:
Let A be an array of Boolean values, indexed by integers 2 to n,
initially all set to true.
我曾经尝试过这样做,但我想到了:(我打算使用#DEFINE,但要打印质数的范围取决于用户输入,每次都不同)
bool *prime = malloc((number1-1) * sizeof(*prime));
但是我认为这只会设置数组的大小,而不是数组中的实际值。
我已经对此进行了一些研究,并在此处找到了类似的问题,但是它们都是针对不同的编程语言的。
答案 0 :(得分:2)
首先, memset
可用于将字节范围设置为任何值,因此:
memset(prime, '\xff', (number1-1) * sizeof(*prime));
应将数组中的所有位设置为1;任何非零值都是true,而 \xff
是全1的字节模式,因此它与其他任何非零值一样真实。
在这里memset
似乎不合适,因此唯一没有更改程序逻辑的明确正确的解决方案就是直线循环:
for (size_t i = 0; i < number1-1; ++i) {
primes[i] = true;
}
也就是说,有一种更聪明的方法可以做到这一点:反转数组的定义。而不是在素数时为true,而不是素数时为true。这样,初始化可以简化为:
bool *notprime = calloc(number1-1, sizeof(*prime));
现在,您可以从通常提供的便宜的归零calloc
中受益(当筛选足够大的范围以使OS为已经归零的内存使用时),而根本不需要将它们初始化为其他值。
注意:分配数组时,您需要sizeof(*prime)
,而不是sizeof(prime)
;我通过等效的calloc
呼叫解决了这个问题。
答案 1 :(得分:2)
您可以使用memset
。通常1
被定义为true,0
被定义为false。
memset(prime,1,n * sizeof(*prime));
另一种方法是使用for循环将数组初始化为1
#include <stdbool.h>
for (int i=0; i<n; i++)
{
prime[i] = true;
}