我正在对Stroustrup的书进行以下练习:
创建一个程序来查找1到100之间的所有素数。 有一种经典的方法可以做到这一点,称为“Eratosthenes的筛子”。 如果您不知道该方法,请上网并查找。使用这种方法编写程序。
我已经理解了练习,但是我在如何用C ++实现它时遇到了问题 这是到目前为止的代码:
typealias closureType = (inputTypes) -> (outputType)
您能否提供一些有助于我成功实施算法的建议?
注意:我可能会再次阅读本章。
答案 0 :(得分:1)
与if(MyListOfIntArrays.Any(MyArray.SequenceEqual))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
向量不同,它在第一个循环中向后推回101次,并且获取大小为101,primi
向量永远不会被推回,因此它保持为零大小。然后,在下一个循环中,当您尝试索引其元素时,"向量下标超出范围"抛出异常。
此外,像nonprimi
这样的表达式是比较语句,除非它们位于numero == nonprimi[i];
语句或if
循环的括号内,否则不会完成任何操作。
考虑这个选择:
第二个while
循环中的长if
语句字面意思是,如果第一个数组中的数字(已填充了0到99之间的所有整数)是2,3,5或7或不能被2,3,5或7中的任何一个整除,然后将其添加到for
向量中。
primi
答案 1 :(得分: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;
}
}