//正确程序
#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;
}