我是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 :(得分: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);
}
}