gpt4 book ai didi

c++ - Eratosthenes 算法筛选素数(C++)

转载 作者:行者123 更新时间:2023-11-28 04:55:31 28 4
gpt4 key购买 nike

我想创建一个函数,根据 ( 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;
}
}
}

代码没有错误,但是没有输出,我不明白为什么。

最佳答案

最里面的循环 for(double j = pow(i,2); j<num; j = j+k*i)相当可疑。

你只想增加j通过 i每次迭代,而是将其增加 i 的某个倍数.

您也不应该添加所有 j s 至 prime ,它们在结构上都是复合的。而是添加 i .

因为 for循环在运行前检查条件,你不需要 throw对于 num < 2,你可以只返回一个空 vector (没有小于 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;
}
}

关于c++ - Eratosthenes 算法筛选素数(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219483/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com