埃拉斯托特尼筛子
Sieve of Erastothenes
本文关键字:埃拉斯 更新时间:2023-10-16
我正在解决欧拉项目中的一些编程问题,在这个问题中停了下来:
生成素数
我理解了算法,但我不理解解决方案中的一件事:
这是我从另一个讨论中得到的解决方案:
void sieve_of_eratosthenes(int n)
{
bool *sieve = new bool[n+1];
// Initialize
sieve[0]=false;
sieve[1]=false;
sieve[2]=true;
for(int i=3;i<n+1;++i)
sieve[i]=true;
// Actual sieve
for(int i=1; i<n+1; ++i)
//**i didnt understood what is the purpose of this condition**
if(sieve[i]==true)
for(int j=2;j*i<n+1;++j)
sieve[j*i]=false;
// Output
cout << "Prime numbers are: " <<endl;
for(int i=0;i<n+1;++i)
if (sieve[i])
cout << i <<endl;
delete [] sieve;
}
int main()
{
int n = 70;
sieve_of_eratosthenes(n);
}
我明白,在这种情况下,我们试图知道数字是否是素数,但我不明白为什么我们跳过非素数
任何帮助都会对我有用,谢谢你
效率。让我们看一下合数4。我们真的需要检查所有其他数的可整除性吗?不,因为我们已经检查过它的质因数了。
简而言之,检查合数是一个多余的过程,因为我们检查了它的质因数。
素数是除了1和它自己之外没有因数的数。
筛选的目的是将质数的所有倍数标记为非质数。为此,我们检查该数是否为素数,并将所有是该素数的倍数的数标记为非素数。
为了更形象一点。我们从第二条开始。
2是素数吗?是的。标记所有2*x,其中x
3是素数吗?是的。标记所有3*x -> 3,6,9等
4是素数吗?不。如果我们没有这种情况,我们就会标记4、8、16等不是素数,但我们已经用2做过了。
相关文章:
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 毕达哥拉斯三重嵌套循环误解
- 列出埃拉托色尼的筛子
- 埃拉托色尼的筛子在一段上
- 如何修复我的 c++ 毕达哥拉斯三重查找器中的'access violation reading location'错误?
- 筛子的埃拉托色尼错误实现
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 埃拉托色尼筛子算法的效率
- 埃拉托色尼的筛子和哥德巴赫猜想
- 链接链接器/加载器错误时"undefined reference to ..."与拉斯皮康库链接时
- 如何将埃勒斯的随机RSI指标从mql4移植到C++(从MT4移植到QChartist)?
- 如何使用埃拉托斯特内斯筛算法改进素数程序
- 优化埃拉托色尼筛
- 使用C++程序中的拉斯皮斯蒂尔读取相机图像
- 欧拉斯(Eulers Phi)数量很大
- 埃拉托申斯孢子虫Prime1 C++的分段筛
- 埃拉托斯梯尼的筛子,数组太大,以至于内存越界
- 分割如何提高埃拉托斯尼筛的运行时间
- 埃拉斯托特尼筛子
- 埃拉托斯梯尼筛-质因子