质数达到数字

Prime Numbers Up To A Number

本文关键字:数字      更新时间:2023-10-16

我真的是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;
}

找到从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;

区别在于您以前的原始条件 - 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);
    }
}