练习的问题
Problems with an exercise?
我正在做Stroustrup书的以下练习:
创建一个程序来查找 1 到 100 之间的所有质数。 有一种经典的方法可以做到这一点,称为"埃拉托色尼筛"。 如果您不知道该方法,请上网查找。使用此方法编写程序。
我已经理解了这个练习,但我在如何在C++中实现它方面遇到了问题。
这是到目前为止的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> nonprimi;
vector<int> primi;
for(int i=0; i <=100; i++){
primi.push_back(i);
}
int numero = 2;
for(int i = 0; i < 100; i++){
numero += 2;
numero == nonprimi[i];
}
numero = 3;
for(int i = 0; i < 100; i++){
numero += 3;
numero == nonprimi[i];
}
numero = 5;
for(int i = 0; i < 100; i++){
numero += 5;
numero == nonprimi[i];
}
numero = 7;
for(int i = 0; i < 100; i++){
numero += 7;
numero == nonprimi[i];
}
for(int i = 0; i < nonprimi.size(); i++){
if(primi[i] != nonprimi[i])
cout << "n" << primi[i] << "n";
}
return 0;
}
你能为我提供一些建议来帮助我成功实施算法吗?
注意:可能我应该再读一遍这一章。
与primi
向量不同,向量在第一个循环中向后推 101 次,它获得的大小为 101,nonprimi
向量永远不会被推回,因此它的大小为零。然后,在接下来的循环中,当您尝试为其元素编制索引时,会引发"矢量下标超出范围"异常。
此外,像这样的表达式numero == nonprimi[i];
是比较语句,除非它们在if
语句或while
循环的括号内,否则不会完成任何操作。
考虑以下替代方法:
第二个 for
循环中的 long if
语句的字面意思是,如果第一个数组(已填充了从 0 到 99 的所有整数(中的数字为 2、3、5 或 7,或者不能被 2、3、5 或 7 中的任何一个整除,则将其添加到 primi
向量中。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
vector<int> nonprimi;
vector<int> primi;
for (int i = 0; i < 100; i++)
{
nonprimi.push_back(i);
}
for (int i = 0; i < nonprimi.size(); i++) {
if (((nonprimi[i] == 2) || (nonprimi[i] == 3) ||
(nonprimi[i] == 5) || (nonprimi[i] == 7)) ||
(nonprimi[i] % 2 != 0) && (nonprimi[i] % 3 != 0) &&
(nonprimi[i] % 5 != 0) && (nonprimi[i] % 7 != 0)) {
primi.push_back(i);
}
}
for (int i = 0; i < primi.size(); i++) {
cout << primi[i] << " ";
}
// or in a more STL way
// copy(primi.begin(), primi.end(), ostream_iterator<int>(cout, " "));
// system("pause");
return 0;
}
这是我
的答案,不确定它是否理想:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
// Find the prime numbers from 2, 3, 4, 5, through 100
// using Sieve of Eratosthenes
vector <int> numbers;
for (int i = 2; i <= 100; i++)
numbers.push_back(i);
int p = 0; // index of "numbers"
cout << "Prime numbers:n";
while (p < (numbers.size() - 1)) {
int prime = numbers[p];
for (int i = p + prime; i < numbers.size(); i += prime)
{
numbers[i] = -1; // make all non-prime numbers less than zero
}
do {
if (p < (numbers.size() - 1)) {
p++; // increase the index until you encounter a positive number
}
else
break;
} while (numbers[p] < 0);
cout << prime << endl;
}
}
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 加速C++练习2.4
- 编译包含字符串的代码时遇到问题
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 尺寸数组 [矩阵] 练习的问题
- 循环练习时的问题
- 我正在尝试[C++]练习多态性和OOD原则。需要指导和几个问题的答案
- C++练习车辆程序问题 - 初学者编程
- 跳到C++第13章练习问题4-指针
- 在linux下练习编程的问题
- 练习的问题
- 跑步练习2-4的问题,来自学习Opencv,O'Reilly
- 简单的记忆问题练习
- 模板练习问题
- 按顺序显示字符串-练习问题