素数达数

时间:2018-04-28 11:49:21

标签: c++ primes

我是C ++的新手,我正在阅读“编程:使用C ++的原理和实践”一书。正在解决这个问题,找到1 - 用户给定数字之间的所有素数。现在我把那部分放下了。我现在明白sqrt(i)会使循环更短但是,我不知道在if - else语句中检查是否要求它是否为素数。

#include<vector>
#include<iostream>
#include<cmath>

using namespace std;

int main(){    
    vector<double> prime_numbers;
    double num;

    cout << "Please enter a number so we can find the primes for it: " << flush;
    cin >> num;

    for (int i = 2; i <= num; i++) {
        for (int j = 2; j <= i; j++) {
            // cout << sqrt(i) << "\t";

            // Check to see if Value of i is incremented correctly
            // Check to see if value of j is incremented properly before returnign to i
            //cout << i <<"\t" << j << endl;       

            if (j == i) {
                prime_numbers.push_back(i);
            }
            if (i % j == 0) {
                break;
            }   

        }   
    }
    for (double x : prime_numbers)
        cout << x << " | ";

    return 0;
}

2 个答案:

答案 0 :(得分:1)

找到从0到n的素数的一种非常有效的方法是使用Eratosthenes的筛子,有很多方法可以做到,这里有一个例子:

vector<bool> v(n, true);
v[0] = v[1] = false;
for (int i = 2; i*i < n; i+= 2){
    if (v[i]) {
        for (int k = i*i; k < n; k += i) {
            v[k] = false;
        }
        if (i == 2)i = 1;
    }
}
for(auto i = 0; i < n; ++i)
      if(v[i])cout << i << ' ';
cout << endl;

答案 1 :(得分:1)

不同之处在于您先前的素性条件 - i == j - 已不再适用。

确切地说,当您检查从2到i的每个数字时,确实如此,但是sqrt(i)限制,您将更早地退出循环。

我认为最简单的改变是引入一个变量并将push_back移出循环(这适用于任何一个循环条件):

for (int i = 2; i <= num; i++) {
    bool isPrime = true;  // Assume 'i' is prime until proven wrong.
    for (int j = 2; j <= sqrt(i); j++) {
        if (i % j == 0) {
            isPrime = false;
            break;
        }   
    }
    if (isPrime) {
        prime_numbers.push_back(i);
    }
 }

即,首先确定是否属于某种情况,然后对该信息进行处理 在很多情况下,这是一个有用的设计。

例如,它可以更容易地将素性检查移动到函数中:

bool isPrime(int x) { /* something */ }

// ...

for (int i = 2; i <= num; i++) {
    if (isPrime(i)) {
        prime_numbers.push_back(i);
    }
}