我正在研究Euler项目的挑战,以找到数字的所有主要因素。我正在使用一个初始化为true的布尔数组,然后通过将bool值更改为false来“交叉”倍数。 (这是Eratosthenes的筛子),但我不知道如何将元素保存为false。我可以列出非质数(或“假”数),但是当我尝试打印质数或“真”数时,它会打印每个数字。如果有人能告诉我我在做什么错,我将非常感激。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
void hope(int n, bool Ar[n])
{
for (int i = 2; i <= n; ++i)
{
if (Ar[i] = (true))
{
for (int j = i*i; j<=n; j = i+j)
{
Ar[j] = false;
}
}
}
for (int i = 2; i <= n; ++i)
{
if (Ar[i] = (true))
{
printf("\ntrue value: %d", i);
}
}
}
int main ()
{
int n = 15;
bool Ar[15] = {true};
hope(n, Ar);
return 0;
}
答案 0 :(得分:3)
答案 1 :(得分:2)
两个主要问题:
如其他陈述所述,条件是错误的(实际上,它为数组元素分配了true,而条件始终为true。
for (int i = 2; i <= n; ++i)
和Ar[i]
-未定义的行为,因为数组是从0
而不是one
索引的,并且您在这里有访问权限。它必须是for (int i = 1; i < n; ++i)
稍后几行for (int j = i*i; **j<=n**; j = i+j)
,然后再次for (int i = 2; **i <= n**; ++i)
答案 2 :(得分:1)
第一期:
bool Ar[15] = {true};
仅将数组中的第一个元素初始化为true
;其余元素将被初始化为false
。但是,您要打印每个数字的原因是
if (Ar[i] = (true))
将true
分配给Ar[i]
,而不是进行比较。您需要将其更改为
if ( Ar[i] == true )
或者甚至更好:
if ( Ar[i] )
答案 3 :(得分:0)
有多个问题:
for (int i = 2; i <= n; ++i)
:由于数组越界问题,这将调用未定义的行为。它必须是for (int i = 1; i < n; ++i)
if (Ar[i] = (true))
,它将始终评估为true,并将Ar[i]
分配给true
。养成使用if (true == Ar[i])
而不是if (Ar[i] == (true))
的习惯,以便编译器抱怨在=
条件下意外使用if
。bool Ar[15] = {true}
仅初始化数组的第一个成员,有多种初始化数组的方法:-)只需浏览stackoverflow或向下滚动即可。有一个改进,请使用以下内容代替您的main
:
#define COUNT_OF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
int main ()
{
//int n = 15;
bool Ar[15] = { [0 ... COUNT_OF(Ar)-1] = true};
hope(COUNT_OF(Ar), Ar);
return 0;
}
这将帮助您根据需要更改数组大小,并且无需在很多地方进行相同的更改即可摆脱困境:-)虽然,本书可能并不完全使用它。请注意,它们并不是纯粹的gcc扩展名,但使用...肯定是gcc扩展名。