umieszczaj kod w znacznikach [ code ] [ / code ]..
widziałem szczere chęci napisania programu, więc oto kod po poprawkach:
Kod: Zaznacz cały
#include<iostream>
#include<string>
using namespace std;
const int B = 1000000;
bool A[B+1];
int primes[B+1];
void sitoEratostenesa()
{
int n,p;
for (p=2; p*p<=B; p++)
{
if (A[p]==false)
for (n=p*p; n<=B; n=n+p)
A[n] = true;
}
}
bool isPrime(int p)
{
if (A[p]==true) return false;
return true;
}
int main()
{
int N;
int a,b;
int i,licznik=0;
sitoEratostenesa();
for(i=2; i<=B; i++)
{
if ( isPrime(i) )
licznik++;
primes[i] = licznik;
}
cin >> N;
for(i=0; i<N; i++){
cin >> a >> b;
if(a==0) cout<<primes[b];
else cout<<primes[b]-primes[a-1];
cout<<endl;
}
return 0;
}
oprócz tego, że działa to Ci posprzątałem w kodzie.. przynajmniej na tyle na ile uważałem to za niezbędne(bo zostawiłem tą funkcję
isPrime() jak była, mimo, że sam bym inaczej ją napisał, żeby działała bardziej logicznie z tą tablicą sita, ale to też i sito by trzeba było poodwracać względem wartości logicznych więc już tak zostawiłem skoro chciałeś)..
trochę martwią mnie Twoje niektóre błędy, ale rozumiem że jakoś długo nie programujesz?
na przyszłość uwagi co do Twojego kodu:
1. nazewnictwo zmiennych..
const int B miało być po to aby nie kolidowało z małym
b w mainie.. wprowadziłeś je w jednym miejscu ale potem już nie, a np w funkcji sita było to konieczne(z resztą nie tylko).. zwróć uwagę gdzie dałem
B, a gdzie
b..
2. martwiące też jest
const int primes = 1000000;.. po pierwsze nie const bo będziesz zmianiał.. poza tym nie pownieneś przypisywać wartości bo tylko deklarujesz tą tablicę, alokujesz jej miejsce w pamięci (przypominam, że jako globalna wypełnia się na starcie zerami)..
3. fragment:
Kod: Zaznacz cały
int i,licznik=0;
for(i=2; i<=B; i++)
{
if ( isPrime(i) )
{
licznik++;
primes[i] = licznik;
}
}
był bardzo w nieeleganckim miejscu.. róbmy takie rzeczy w main.. poza tym wciąż do tego fragmentu: sprawdzanie w tym miejscu
isPrime(i) nie ma żadnego sensu bo jeszcze się nie wykonało sito.. sito się wykona dopiero w main i wtedy ten test pierwszości będzie miał sens.. i ostatnia uwaga do tych linijek - pomysł jak najbardziej na miejscu, ale wykonanie złe.. mianowicie
primes = licznik; powinno być w każdym kroku pętli (dlatego wywaliłem je pod ifa), bo każdej komórce primes trzeba coś przypisać, czasem tylko to będzie liczba o jeden większa, jeśli natrafiliśmy na liczbe pierwszą (uzasadnienie w postach wyżej)..
4. chaos w mainie i niepotrzebna tablica int tab[N]..
5. chyba tyle..
mam nadzieję, że było to jakoś pouczające.. jeśli o wytłumaczeniu czegoś zapomniałem, bądź wciąż coś jest niejasne to pisz..