Wyjaśnienie kodu

QK
  • Rejestracja: dni
  • Ostatnio: dni
0

Przeglądając książkę C. Dellanoy'a natrafiłam na kod którego nie rozumiem. Jest to implementacja tzw. sita Eratostenesa, algorytmu który wyszukuje liczby pierwsze. Jeśli ktoś mógłby mi wyjaśnić to byłabym wdzięczna.

Nie rozumiem co robi ta pętla i dlaczego nie mogę jej zastąpić zwykłym ifem?

Kopiuj
while(liczby[++pierwsza] && pierwsza<n){}   

Kod:

Kopiuj
#include <stdio.h>
#define MAX 10000
#define TRUE 1
#define FALSE 0
int main(void){

long int liczby[MAX+1];
int pierwsza, i, n;

printf("Podaj przedzial od 1 do 10000:\n");
scanf("%d", &n);

//zerowanie
for(i=1; i<n; i++)
    liczby[i]=FALSE;
liczby[1]=TRUE;

//szukanie pierwszych
pierwsza=1;
while(pierwsza*pierwsza<=n){
    while(liczby[++pierwsza] && pierwsza<n){}   
        for(i=2*pierwsza; i<=n; i+=pierwsza)
            liczby[i]=TRUE;

}
//wypis
printf("Liczby pierwsze:\n");

for(i=1;i<n;i++)
if(!liczby[i])
{
    printf("%d ", i);

}
return 0;
}
 
hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie możesz jej zastąpić if'em gdyż to jest pętla i ona wykona się więcej niż raz. Przeanalizuj dokładnie z debuggerem co się tam dzieje a dowiesz się jak to działa.

QK
  • Rejestracja: dni
  • Ostatnio: dni
0

Ale po co ona jest, skoro ma po sobie klamry, czyli teoretycznie nic nie robi?

LN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1398
1

Robi - przeanalizuj to ++ w warunku pętli.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.