使用地图使用eratosthenes筛子进行记忆和素数生成

时间:2015-02-10 20:27:52

标签: c++ primes sieve-of-eratosthenes

#include<iostream> 
#include<map> 
#include<algorithm> 
#include<math.h>
using namespace std ; 
map< long long int , long long int > prim ;
map< long long int , long long int >::iterator it ;

int c, counter, check ;
long long int b ;
int prime( long long int t)
{  
    if( t==1 )
    {
        prim[1] = 1 ;
        counter = 1 ;
        it=prim.begin() ;
        //cout<< it->second  ;
        return 1 ;    
     }
     else
     {
         check = -1 ;
         long long int f ; 
         f= int(sqrt(t)) ; // could create prob
         for(  it=prim.begin()  ; it!= prim.end() || it->second <=f ;  it++)
         {  
             if( (t % (it->second))==0  &&  it->second != 1 )
             {
                 cout << "not prime " << "\n" ;
                 check = 0 ;
                 // not prime 
                 break ; 
             }        
         }

         if(check==-1)
         { 
             //  prime ;
             counter ++ ; 
             prim[counter] = t ; 
             return 1 ;
         }  

         else if(check==0)
             return 0 ;

     } 
 }  

 int main()
 {
     int check2 ;
     check2 = 1  ; // value set 1 to call it prime 

     cout<< "input no ";

     cout<<"\n";

     cin >>b ;

     for( long long  int z=1 ;z <=int(sqrt(b)); z++  )
     {
         c = prime(z) ;
         //cout<<"z is "<<z <<"\n";

         if ( c==1  && z!=1 )
         {
             if((b%z) == 0)
             {
                 //cout<< "not prime " ; 
                 check2 = 0 ;
                 break ;  
             }
         }
    }

    if(check2!=0)
    {
        cout<<"\n";
        cout<< "prime"  ;
    }
    else 
        cout<< "not prime " ;  

    for(  it=prim.begin()  ; it!= prim.end() ;  it++)
    { 
        cout<<"\n" ; 
        cout<< it->first ; 

        cout<< it->second ; 
        cout<< " \n"  ;

    }

    return 0 ;
}
好吧,我在200以上的数字方面遇到问题,而且这些都是素数问题。程序没有正确执行给出意外的值。

如果你们能告诉我有关错误或更好的方法来生成质数图,请做!

1 个答案:

答案 0 :(得分:1)

以下是模板希望它有所帮助,如果你必须从1生成所有素数,它需要 O(nlog(logn))时间和 O(n)内存到n

     void print_primes(int n)
     {
          int primes[n+1],start=2,i;

          /* Initialization , if primes[i]=1 it means
             i is prime and if 0 it means i is composite,
             initially assume all are prime */
          for(int i=1;i<=n;i++)primes[i]=1;

          /*Seives method*/
          while(start*start<=n)
          {
               for(i=start*start;i<=n;i=i+=start)
                  primes[i]=0;
               for(i=start+1;i<=n;i++)
               {
                   if(primes[i])
                      break;
               }
               start=i;
          }

          /*Just printing all primes from 1 to n
            if primes[i]=1 it means i is prime 
            and if 0 it means i is composite*/
          for(i=2;i<=n;i++)
          {
              if(primes[i])
                cout<<i<<endl;
          }
     }

由于alain建议不需要地图,数组/矢量会很好。你也可以在这里使用上面的函数检查从1到1000000的所有素数:http://coliru.stacked-crooked.com/a/b617a4d1f1d16ac5