Co w tym programie robi zmienna Licz ? Zakładam, że liczy obiegi pętli, ale czy może ktoś jasno wytłumaczyć krok po kroku to :
If ((i mod j) = 0) Then Licz:=Licz+1; Czemu + 1 ? IF Licz = 2 then begin ?? Dlaczego akurat 2, a nie np. 3 ?
Proszę o jasne wytłumaczenie, daje 40 pkt !!
Program Liczby_pierwsze; Uses Crt; Var N, K : Integer; i, j : Integer; Licz : Integer; Begin Repeat Clrscr; Writeln('Podaj liczbę naturalną (N > 1)'); Write('n = '); Readln(N); Until (N > 1); K:= 1; Write('Liczby pierwsze: '); For i:=1 To N Do Begin Licz :=0; For j:=1 To N Do If ((i mod j) = 0) Then Licz:=Licz+1; If Licz = 2 Then Begin Write(i,' '); K:=K+1 End; End; Writeln; Writeln('Liczba liczb pierwszych = ',k); Repeat Until Keypressed; End.
CCCP
//If ((i mod j) = 0) Then Licz:=Licz+1; Czemu + 1 ?// Jeśli i dzieli się całkowicie przez j [tj. reszta z dzielenia i przez j jest równa 0], wtedy powiększę obecny stan licznika o 1. Dlaczego 1? Dlatego, że ten fragment zlicza ile razy występuje równość i mod j = 0.
//If Licz = 2 Then Begin Write(i,' ');?? Dlaczego akurat 2, a nie np. 3 ?//
Jeśli licznik jest równy 2 wtedy wyświetl wartość zmiennej i. Dlaczego dwa? Dlatego, że autor kodu tak sobie obmyślił. Ma to jednak logiczne uzasadnienie: jeśli pojawią się tylko dwie liczby spełniające równość i mod j = 0 wtedy je wyświetlamy.
0 votes Thanks 0
Zargall
A) If ((i mod j) = 0) Then Licz:=Licz+1; Czemu + 1 ? Pętla zwiększa Licz jeżeli warunek jest spełniony. A warunek jest prawdą gdy reszta z dzielenia równa się zero. Wpisując liczbę N pętla zaczyna liczyć od jedynki aż do N ile razy warunek został spełniony. Z definicji liczby pierwszej wynika, że: "Liczba pierwsza – liczba naturalna, która ma dokładnie dwa dzielniki naturalne: jedynkę i siebie samą, np. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, itp." - http://pl.wikipedia.org/wiki/Liczba_pierwsza Więc żeby liczba była liczbą pierwszą i algorytm uznał ją za taką musi być dokładnie Licz równe 2. Jeżeli będzie różne od zera, to liczba nie jest pierwszą.
B) IF Licz = 2 then begin ?? Dlaczego akurat 2, a nie np. 3 ? Tu właśnie jest zapisany warunek jaki musi spełnić liczba aby algorytm zaliczył ją do pierwszej.
Uwaga!!! Jedna uwaga do algorytmu. Nie wiem kto go pisał ale liczba pierwsza to zgodnie z definicją (podana wyżej) więc na końcu program podaje błąd zaliczając 1 jako liczbę pierwszą. Jeżeli chcesz to zmodyfikować to zamiast: K:=1; wpisz K:=0; Będzie liczyć liczby pierwsze poprawnie.
Jeśli i dzieli się całkowicie przez j [tj. reszta z dzielenia i przez j jest równa 0], wtedy powiększę obecny stan licznika o 1.
Dlaczego 1? Dlatego, że ten fragment zlicza ile razy występuje równość i mod j = 0.
//If Licz = 2 Then Begin
Write(i,' ');?? Dlaczego akurat 2, a nie np. 3 ?//
Jeśli licznik jest równy 2 wtedy wyświetl wartość zmiennej i.
Dlaczego dwa? Dlatego, że autor kodu tak sobie obmyślił. Ma to jednak logiczne uzasadnienie: jeśli pojawią się tylko dwie liczby spełniające równość i mod j = 0 wtedy je wyświetlamy.
If ((i mod j) = 0) Then Licz:=Licz+1; Czemu + 1 ?
Pętla zwiększa Licz jeżeli warunek jest spełniony. A warunek jest prawdą gdy reszta z dzielenia równa się zero. Wpisując liczbę N pętla zaczyna liczyć od jedynki aż do N ile razy warunek został spełniony. Z definicji liczby pierwszej wynika, że:
"Liczba pierwsza – liczba naturalna, która ma dokładnie dwa dzielniki naturalne: jedynkę i siebie samą, np.
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, itp." - http://pl.wikipedia.org/wiki/Liczba_pierwsza
Więc żeby liczba była liczbą pierwszą i algorytm uznał ją za taką musi być dokładnie Licz równe 2. Jeżeli będzie różne od zera, to liczba nie jest pierwszą.
B)
IF Licz = 2 then begin ?? Dlaczego akurat 2, a nie np. 3 ?
Tu właśnie jest zapisany warunek jaki musi spełnić liczba aby algorytm zaliczył ją do pierwszej.
Uwaga!!!
Jedna uwaga do algorytmu. Nie wiem kto go pisał ale liczba pierwsza to zgodnie z definicją (podana wyżej) więc na końcu program podaje błąd zaliczając 1 jako liczbę pierwszą. Jeżeli chcesz to zmodyfikować to zamiast:
K:=1;
wpisz
K:=0;
Będzie liczyć liczby pierwsze poprawnie.