统计一个数N以内的所有素数,用的是筛数法

//正确程序
#include "iostream"
using namespace std;
#define N 10000

int main()
{
bool x[N + 1] = { false };
int count[N + 1] = { 0 };
int prime[N + 1] = { 0 }; //?
int len = 0;

for (int i = 2; i <= N; i++)
{
    if (!x[i])
    {
        prime[len++] = i;
        for (int j = i + i; j <= N; j += i)
            x[j] = true;
    }
}

for (int i = 0; i < N; i++)
    cout << prime[i] << endl;

}

//错误程序
#include "iostream"
using namespace std;
#define N 10000

int main()
{
bool x[N + 1] = { true };
int count[N + 1] = { 0 };
int prime[N + 1] = { 0 }; //?
int len = 0;

for (int i = 2; i <= N; i++)
{
    if (x[i])
    {
        prime[len++] = i;
        for (int j = i + i; j <= N; j += i)
            x[j] = false;
    }
}

for (int i = 0; i < N; i++)
    cout << prime[i] << endl;

}

我认为两个程序的逻辑思想是完全一样的,但是就是在初始化x[N+1]数组的是否,是初始化为false还是true时,出现了错误。我没有想明白这是什么原因,恳请赐教

bool x[N + 1] = { true };
这个只初始化了第一个元素为true,后面的还是 false
if (x[i])
这个始终不成立,代码得不到执行

你调试下就知道。其实第一个程序只是因为本来数组都是false,你“无意识”撞对了。

bool数组的默认值为false ,并且bool x[N + 1] = { true };这样的声明只是对第一个元素进行初始化。

布尔数组中只有第一个值为true,其他都是false。
可以参阅initializer_list相关资料。

#include "iostream"
using namespace std;
#define N 100
static int sum=0;
int main()
{
bool x[N + 1] = {false};
int count[N + 1] = { 0 };
int prime[N + 1] = { 0 };
int len = 0;
for (int i = 2; i <= N; i++)
{
if (!x[i])
{
prime[len++] = i;
for (int j = i + i; j <= N; j += i)
x[j] =true;
sum++;
}
}

for (int i = 0; i < sum; i++)
cout << prime[i] << endl;
}