c++ - 练习有问题?

标签 c++

我正在对 Stroustrup 的书进行以下练习:

Create a program to find all the prime numbers between 1 and 100. There is a classic method for doing this, called the “Sieve of Eratosthenes.” If you don’t know that method, get on the web and look it up. Write your program using this method.

我已经理解了这个练习,但我对如何用 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 vector 不同,它在第一个循环中被推回 101 次,它的大小为 101,nonprimi vector 永远不会被推回,所以它保持不变大小为零。然后,在下一个循环中,当您尝试对其元素进行索引时,将抛出“vector 下标超出范围”异常。

此外,像这样的表达式 numero == nonprimi[i]; 是比较语句,除非它们在 if 语句或 while 循环。

考虑这个替代方案:

第二个 for 循环中的长 if 语句的字面意思是,如果第一个数组中的数字(已经用 0 到 99 的所有整数填充)是2、3、5 或 7 或不能被 2、3、5 或 7 中的任何一个整除,然后将其添加到 primi vector 中。

#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;
}

关于c++ - 练习有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376844/

相关文章:

c++ - 无法检查非整数输入

c++ - 什么时候计算右值?

C++ 模板和目标代码实例化

c++ - 实现一个简单的 RTSP 客户端/示例

c++ - 在 Windows Qt Project 上存储外部库的最佳实践

c++ - 如果我不想使用 QMainWindow 的布局,我应该使用什么来代替 QMainWindow? QMainWindow 应该首选在哪里?

c# - 如何向 MFC 应用程序添加 list 并设置支持的操作系统?

c++ - AMD_pinned_memory - 同步传输到纹理

c++ - 如何手动分配 vector 的大小?

C++ 和模块化 : Where am I supposed to draw the line?