Sito nie działa - liczby pierwsze

0

Napisałem sobie sito - chcę znaleźć max liczbę pierwszą w [2,n]. To taki algorytm może nie najbardziej optymalny, ale w takiej postaci to rozumiem. Czemu to nie działa (zapętla się?)

#include <iostream>

using namespace std;

int sito(int n)
{
    int i,j, tab[n];
    for(i=0; i<=n; i++)
    {
        tab[i]=1;            // wstepne przygotowanie tablicy
    }

    for(j=2; j<n; j++)
    {
        int k=j;
        while(k<n)
        {
            k=k+j;                // wielokrotnosc danej liczby
            tab[k]=0;          // wyzerowanie wielokrotnosci
        }
    }

    int max = 0;

    for(i=2; i<n; i++)
        if (tab[i] == 1)
            max =  i;
    return max;
}

int main()
{
    cout << sito(10) << "\n";
    return 0;
}
0

U mnie wywala błąd segmentacji, a po usunięciu zbędnego = z pierwszego for-a (ma być for(i=0; i<n; i++) oraz dodaniu pustego couta po zakończeniu jego pętli działa (po co ten cout nie mam pojęcia, jakiś błąd w obsłudze pamięci sprawia że potrzebny jest odstęp czasowy między forami?) Swoją drogą nie wiem czy we while-u nie powinieneś odwrócić kolejności poleceń

0

przekraczasz zakres tablicy w obu pętlach for

0

Hmm, na ideone też nie działa, zmieniłem pętlę pierwszą (wychodziłem poza tablicę) http://ideone.com/zuXRuu

0

Ma być: tab[n+1]
Najlepiej to napisać po ludzku:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
 
bool sito(size_t n)
  {
   if(n<2) return false;
   vector<bool> tab(n+1,true);
   tab[0]=tab[1]=false;
   size_t max=(size_t)sqrt(n);
   for(size_t i=2;i<=max;++i) if(tab[i]) for(size_t k=i*i;k<=n;k+=i) tab[k]=false;
   return tab[n];
  }
 
int main()
  {
   for(size_t i=0;i<100;++i) if(sito(i)) cout<<i<<endl;
   return 0;
  }
0

Dzięki, ale ten kod mam (mniej więcej), ale zastanawiam się, czemu mój sposób nie działa? To taki troche brute force way, ale działać powinien.

ciekawostką jest, jak wyjmę to z funkcji i wsadzę w maina ... działa. Czemu?

#include <iostream>

using namespace std;

int main()
{
    int n = 10;
    int i,j, tab[n];
    for(i=0; i<n; i++)
    {
        tab[i]=1;            // wstepne przygotowanie tablicy
    }
    cout << "\n";

    for(j=2; j<n; j++)
    {
        int k=j;
        while(k<n)
        {
            k=k+j;                // wielokrotnosc danej liczby
            tab[k]=0;          // wyzerowanie wielokrotnosci
        }
    }

    int max = 0;

    for(i=2; i<n; i++)
        if (tab[i] == 1)
            max =  i;
    cout << max << "\n";
    return 0;
}

$ g++ --version
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3

0

Hmm, ale na ideone nie działa :| http://ideone.com/WRl46m

1 użytkowników online, w tym zalogowanych: 0, gości: 1