мемоизация и генериране на прости числа с помощта на сито на Ератостен с помощта на карти

#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 и които са прости. програмата не се изпълнява правилно и дава неочаквани стойности.

ако можете да ми кажете за грешките или по-добри начини за генериране на карта на прости числа, моля, направете го!


person v_g    schedule 10.02.2015    source източник
comment
Като начало, a, c,d , h , i ,j , k , l, b не са добри имена за променливи; отнема много повече време за четене и разбиране на програмата с такива имена; и е по-трудно сами да намерите проблеми...   -  person Alex Shesterov    schedule 10.02.2015
comment
Освен това C++ ви позволява да декларирате променливи в момента, в който за първи път имате нужда от тях; няма нужда да декларирате всичко глобално.   -  person Alex Shesterov    schedule 10.02.2015
comment
Моля, коригирайте форматирането си.   -  person genisage    schedule 10.02.2015
comment
Защо map? Обикновено vector би било по-подходящо за това.   -  person alain    schedule 10.02.2015
comment
@alain тепърва ще срещам вектори, прочетох за карти и затова се опитах да го приложа. ще го потърся. Благодаря .   -  person v_g    schedule 10.02.2015
comment
@AlexShesterov хм съжалявам. нямаше да се случи отново.   -  person v_g    schedule 10.02.2015


Отговори (1)


Следва шаблон, надявам се да помогне, отнема O(nlog(logn)) време и O(n) памет, ако трябва да генерирате всички прости числа от 1 до 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;
          }
     }

Както Ален предложи, няма нужда от карта, масивът/векторът ще се справи добре. Можете също да проверите всички прости числа от 1 до 1000000, които се отпечатват, като използвате горната функция тук: http://coliru.stacked-crooked.com/a/b617a4d1f1d16ac5.

person sashas    schedule 10.02.2015
comment
while(start<=sqrt(n)) може да се модифицира до while(start*start<=n), като по този начин се заобикаля скъпата функция sqrt. Също така i=i+=start watwat? - person P i; 11.02.2015
comment
ако искате да му придадете допълнителен разцвет, можете да се свържете с работещ coliru.stacked-crooked.com код. - person P i; 11.02.2015
comment
@Pi благодаря, че не знаех за този онлайн редактор, добави връзката - person sashas; 11.02.2015
comment
Благодаря, @sasha, но ако случайно откриете грешката в моя код, моля, уведомете ме. Вашето обаче е много по-добро изпълнение. - person v_g; 11.02.2015