练习的问题

Problems with an exercise?

本文关键字:问题 练习      更新时间:2023-10-16

我正在做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;
    }
    
}