Trochę Ci uporządkowałem kod:
Kod: Zaznacz cały
#include <iostream>
#include<iomanip>
using namespace std;
const int NMAX=400;
int LICZBY[NMAX];
int FLAGA[NMAX];
int main()
{
int n;
cout<<"Podaj ilosc liczb : ";
cin>>n;
for(int i=0; i<n;i++)
{
LICZBY[i]=i+1;
FLAGA[i]=1;
}
FLAGA[0]=0;
for(int i=2;i<n;i++)
for (int p=2;p<=i;p++)
FLAGA[p*i-1]=0;
for(int i=0;i<n;i++)
cout<<LICZBY[i]<<" "<<FLAGA[i]<<endl;
return 0;
}
myślę, że teraz trochę bardziej widać co i jak..
nic dziwnego, że wychodzi poza zakres, weź
\(\displaystyle{ n=30}\), wtedy będzie w którymś kroku pętli
\(\displaystyle{ p\cdot n > NMAX}\), a więc Segmentation Fault.. może napisz co to za metoda, którą masz polecenie znaleźć liczby pierwsze? bo nie bardzo rozumiem, Twoja własna? kilka modyfikacji i mamy sito Eratostenesa, które będzie działać dobrze, ale nie wiem po prostu czy tego chcesz, czy ma to być inaczej..
-- 7 lis 2011, o 23:51 --
ok, mam:
Kod: Zaznacz cały
#include <iostream>
#include<iomanip>
using namespace std;
const int NMAX=400;
int LICZBY[NMAX];
int FLAGA[NMAX];
int main()
{
int n;
cout<<"Podaj ilosc liczb : ";
cin>>n;
for(int i=1; i<=n;i++)
{
LICZBY[i]=i;
FLAGA[i]=1;
}
FLAGA[0]=0;
FLAGA[1]=0;
for(int i=2;i*i<=n;i++)
if(FLAGA[i]==1)
for (int p=i+i;p<=n;p+=i)
FLAGA[p]=0;
for(int i=1;i<=n;i++)
cout<<LICZBY[i]<<" "<<FLAGA[i]<<endl;
return 0;
}
może być?
zauważ że teraz robimy tylko do
\(\displaystyle{ \sqrt{n}}\) pierwszą pętlę a więc optymalniej.. ponadto do komórek w tablicy
FLAGA odwołujemy się za pomocą tylko zmiennej
p (co ułatwia sprawę) i o której wartościach wiemy wszystko - nie przekroczymy zakresu, nie będzie błędu.. chyba działa całkiem ładnie..
-- 7 lis 2011, o 23:53 --
wszystko jasne? jeśli coś nie jest, to pytaj śmiało..-- 8 lis 2011, o 00:00 --zauważ, że tablica
LICZBY przy tym wariancie jest zupełnie zbędna, bowiem
LICZBY = i i to nam wystarczy..