如何在布尔数组中一次将所有值设置为true?

时间:2018-11-06 11:39:33

标签: c

我正在尝试创建一个程序,使用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));

但是我认为这只会设置数组的大小,而不是数组中的实际值。

我已经对此进行了一些研究,并在此处找到了类似的问题,但是它们都是针对不同的编程语言的。

2 个答案:

答案 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;   
}