通过埃拉托色尼筛算法(C++)查找素数
Posted
技术标签:
【中文标题】通过埃拉托色尼筛算法(C++)查找素数【英文标题】:Finding prime numbers by Sieve of Eratosthenes algorithm(C++) 【发布时间】:2017-11-10 09:26:58 【问题描述】:我想创建一个函数,根据 (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;
代码没有错误,但是没有输出,我不明白为什么。
【问题讨论】:
在解决整数(整数)问题时不要在任何地方使用浮点数。 旁白:x == true
在布尔上下文中完全等同于 x
@Caleth 但我确实检查 [j] = 0,我想它应该使一些系数等于 0。我说得对吗?
为什么要把每个 j 推到素数上?
你的代码可能还有其他问题,但我看到for(int i;i<v.size();++i)
应该初始化i=0
【参考方案1】:
最里面的循环for(double j = pow(i,2); j<num; j = j+k*i)
相当可疑。
您只想在每次迭代中将j
增加i
,而是将其增加i
的一些倍数。
您也不应该将所有j
s 添加到prime
,它们是通过构造全部复合的。而是添加i
。
因为for
循环在运行前检查条件,所以不需要throw
for num
您可以在整个int
中使用int
,而不是在double
中做整数问题。
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++)查找素数的主要内容,如果未能解决你的问题,请参考以下文章