埃拉托色尼筛选法的C++实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了埃拉托色尼筛选法的C++实现相关的知识,希望对你有一定的参考价值。

参考技术A

#include <iostream>
using namespace std;
void FilterPrime(int n)
bool* isPrimes = new bool[n+1];
for(int i=2;i<=n;++i)
isPrimes[i] = true;
isPrimes[2] = true;
for(int j=2;j<=n;++j)
if(isPrimes[j]==true)
for(int m=2;j*m<=n;++m)
isPrimes[j*m] = false;
for(int k=2;k<=n;++k)
if(isPrimes[k]==true)
cout<<k<<是素数<<endl;
delete [] isPrimes;

int main()
int num;
cin>>num;
FilterPrime(num);
system(pause);
return 0;
其中包含伪代码
long CacheFriendlySieve(long n)
long count=0;
long m=(long)sqrt((double)n);
bool* composite=new bool[n+1];
memset(composite,0,n);
long* factor=new long[m];
long* striker=new long[m];
longn_factor=0;
for(long i=2;i<m;++i)
if(!composite[i])
++count;
striker[n_factor]=Strike(composite,2*i;i,m);
factor[n_factor++]=i;

//将筛划分成大小为sqrt(n)的窗口
for(long window=m+1;window<=n;window+=m)
long limit=min(window+m-1,n);
for(long k=0;k<n_factor;++k)
//Strike遍历窗口大小为sqrt(n)的部分数组
Striker[k]=Strike();
for(long i=window;i<limit;++i)
if(!composite[i])
++count;

delete[] striker;
delete[] factor;
delete[] composite;
return count;

埃拉托色尼筛的问题

【中文标题】埃拉托色尼筛的问题【英文标题】:Issues with Sieve of Eratosthenes 【发布时间】:2018-03-12 20:00:21 【问题描述】:

我学习了“使用 C++ 进行编程原理和实践”,并且正在做一个涉及 Eratosthenes 筛法的早期问题,但我得到了意外的输出,但我无法确定到底是什么问题。这是我的代码:

#include <iostream>
#include <vector>

int main()

    std::vector<int> prime;
    std::vector<int> nonPrime;
    int multiple = 0;


    for(int i = 2; i < 101; i++) //initialized to first prime number, i will 
       // be the variable that should contain prime numbers
        
            for(int j = 0; j < nonPrime.size(); j++) //checks i against 
                                                      //   vector to see if 
                                                      //  marked as nonPrime
                
                    if(i == nonPrime[j])
                        
                            goto outer;//jumps to next iteration if number 
                                        // is on the list
                        
                

                prime.push_back(i); //adds value of i to Prime vector if it 
                                         //passes test

                for(int j = i; multiple < 101; j++) //This loop is where the 
                                                      // sieve bit comes in
                                               
                        multiple = i * j;           
                        nonPrime.push_back(multiple);
                    
                outer:
                    ;
        

        for(int i = 0; i < prime.size(); i++)
            
                std::cout << prime[i] << std::endl;
            


    return 0;

这个问题目前只要求我使用这种方法找到最多 100 个素数。我还尝试使用当前的“goto”方法在某些条件下跳过双循环,我还尝试在检查循环之后使用带有 if 语句的布尔标志,并简单地使用“继续”;声明,两者都没有任何效果。

(老实说,我认为既然人们说 goto 是邪恶的,也许它会产生我没有预见到的后果,这就是我试图将其切换出来的原因)但问题并不要求我使用模块化函数,所以我假设它希望我在 main 中解决所有问题,因此我在 main 中使用嵌套循环的问题。哦,为了进一步说明我的输出问题,它似乎只将 2 的倍数添加到 nonPrime 向量中,但其他所有内容都检查为通过测试(例如 9)。

谁能帮我理解我哪里出错了?

【问题讨论】:

大学辍学对软件开发行业来说并不是什么大事。公司不关心你的正规教育。无论如何,学术界在教授 CS 方面做得很糟糕。因此,请继续阅读书籍/在线参考资料。 @Ron 感谢您的鼓励,我非常感谢。这本书很枯燥,似乎以一种不利于学习的方式出现,但无论我是否继续前进,我仍然想至少了解我做错了什么。如果您不从中吸取教训,就无法从错误中改进,我从我的个人经验中知道这一点比我愿意承认的要好。另一方面,有书籍推荐吗?随时欢迎咨询! 不客气。不要太担心它。跳过它继续前进。熟悉该语言后,请阅读 Scott Meyers “Effective C++”书籍。 C++ 是一头奇怪而美丽的野兽。 注意:Eratosthenes 的筛子通常使用bool 的大数组来实现。 vector::push-back 将会变得昂贵,并且可能需要尽可能多的存储空间。 Wikipedia has a great page on it and how it works。演示 GIF 几乎可以告诉您您需要知道的所有事情。然后文本填充其余部分。 【参考方案1】:

鉴于这不是实现埃拉托色尼筛法的好方法,我将指出对您的代码的一些更改,以使其至少输出正确的序列。

还请注意,在第一个内循环之后,您选择的缩进有点误导。

#include <iostream>
#include <vector>

int main()

    std::vector<int> prime;
    std::vector<int> nonPrime;
    int multiple = 0;


    for(int i = 2; i < 101; i++) 
    
        // you can use a flag, but note that usually it could be more 
        // efficiently implemented with a vector of bools. Try it yourself
        bool is_prime = true;
        for(int j = 0; j < nonPrime.size(); j++)
        
            if(i == nonPrime[j])
            
                is_prime = false;
                break;
            
        

        if ( is_prime )
        
            prime.push_back(i);
            // You tested 'multiple' before initializing it for every
            // new prime value
            for(multiple = i; multiple < 101; multiple += i)
                                       
                nonPrime.push_back(multiple);
            
        
    

    for(int i = 0; i < prime.size(); i++)
    
        std::cout << prime[i] << std::endl;
    

    return 0;

【讨论】:

以上是关于埃拉托色尼筛选法的C++实现的主要内容,如果未能解决你的问题,请参考以下文章

埃拉托色尼筛选法的介绍

埃拉托色尼筛选法的步骤

关于埃拉托色尼筛选法的整理(质数问题)

筛选 Eratosthenes 素数高达一百万 c++

埃拉托色尼筛的问题

算法设计与分析基础1埃拉托色尼筛选法