在 Stroustrup 的编程:使用 C++ 的原则和实践,第 4 章,练习 13 中,我必须编写一个程序来使用 Erathostenes 筛法查找给定范围内的所有素数。
到目前为止,我想出了这个:
vector<int> values;
void initialize_values()
{
for (int i{0}; i < 100; ++i)
values.push_back(1);
}
void remove_composites(vector<int> values)
{
for(int i{2}; i * i < values.size(); ++i)
{
if (values[i] == 1)
{
for (int p{i + i}; p < values.size(); p += i)
values[p] = 0; //not working
}
}
}
int main()
{
initialize_values();
remove_composites(values);
for (int i{2}; i < values.size(); ++i)
{
if (values[i] == 1)
cout << i << " ";
}
cout << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个大小为 100 的向量(在第一种情况下)并将元素初始化为 1。然后我检查iwhile 的所有索引倍数i * i < 100并将这些索引处的值更改为 0,最后打印值为 1 的索引。
问题是values[p] = 0没有将值 0 分配给索引处的元素,p我真的不明白为什么。
编辑所以在阅读评论和答案后,我决定将所有代码移到 下main(),因为我不知道如何使用引用。根据这本书,这个练习的目标是习惯于处理用户输入、使用循环、迭代等。在这一点上,它不是专业的,也不是专家。
对于所有在这里多年编码和回答问题的人,请记住您曾经是学习者和初学者。有一些尊重,不要把这个社区变成一个有毒的社区。
更新代码:
int main()
{
vector<int> values;
for (int i{0}; i < 100; ++i)
values.push_back(1);
for(int i{2}; i * i < values.size(); ++i)
{
if (values[i] == 1)
{
for (int p{i + i}; p < values.size(); p += i)
{
//cout << p << " ";
values[p] = 0;
}
//cout << '\n';
}
}
for (int i{2}; i < values.size(); ++i)
{
if (values[i] == 1)
cout << i << " ";
}
cout << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并按预期工作:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Run Code Online (Sandbox Code Playgroud)
谢谢大家。
问题是
values[p] = 0没有将值分配给0索引处的元素p
它正在分配它。
问题是您正在对原始向量的副本进行操作,而该副本是 本地的remove_composites,这就是调用代码看不到更改的原因。
更改您的函数签名以使用引用类型参数:std::vector<int>&。
您的代码还存在其他一些问题(使用错误的类型,即int代替bool; 不一致的签名;可变的全局变量)。