我想创建一个函数,根据(Sieve of Eratosthenes)算法找到所有素数,直到数字num
这是我的代码:
vector<int> prime(double num){
vector<int> check;
vector<int> prime;
if(num < 2) throw "Number must be bigger than or equal to 2!";
for(int i = 0; i<num;++i){
check.push_back(1);
}
for(double i = 2;i<sqrt(num);++i){
int k = 1;
if(check.at(i) == true){
for(double j = pow(i,2); j<num; j = j+k*i){
check[j] = 0;
prime.push_back(j);
++k;
}
}
}
return prime;
}
int main(){
int num;
vector<int> v;
cout << "Enter number n bigger than 1:";
cin >> num;
v = prime(num);
for(int i;i<v.size();++i){
cout << v[i];
}
}
我按部分检查了代码,除了这部分外,一切都正常工作:
for(double i = 2;i<sqrt(num);++i){
int k = 1;
if(check.at(i) == true){
for(double j = pow(i,2); j<num; j = j+k*i){
check[j] = 0;
prime.push_back(j);
++k;
}
}
}
代码中没有错误,但没有输出,我无法理解原因。
答案 0 :(得分:1)
最里面的循环for(double j = pow(i,2); j<num; j = j+k*i)
相当可疑。
您只希望每次迭代j
增加i
,而是将其增加i
的某个倍数。
您也不应该将所有j
添加到prime
,它们都是构建所有复合的。而是添加i
。
由于for
循环在运行之前检查条件,因此对于num&lt;而不需要throw
2,你可以只返回一个空向量(没有小于2的素数)
而不是在double
中执行整数问题,您可以在整个过程中使用int
。
vector<int> prime(int num){
vector<bool> check(num, true); // num copies of true
vector<int> prime;
for(int i = 2; i < num; ++i){
if(check[i]){
prime.push_back(i);
for(int j = i*i; j < num; j += i){
check[j] = false;
}
}
}
return prime;
}
int main(){
cout << "Enter number n bigger than 1:";
int num;
cin >> num;
vector<int> v = prime(num);
for(int i : v){
cout << i;
}
}