4. Liczby pierwsze

Transkrypt

4. Liczby pierwsze
Liczby pierwsze
Liczbę naturalną n nazywamy liczbą pierwszą, jeśli posiada ona tylko dwa podzielniki: 1 oraz n.
Użytkownik wprowadza liczbę naturalną n (załóżmy, że n > 1). Podaj algorytm sprawdzania, czy n jest liczba
pierwszą. (Np.: po wprowadzeniu liczby 2 program powinien wyświetlić komunikat „tak”, natomiast po
wprowadzeniu liczby 22 powinien pojawić się komunikat „nie”).
Specyfikacja algorytmu:
Dane wejściowe:
liczba naturalna n (n > 1)
Dane wyjściowe:
komunikat „tak” lub „nie” w zależności od tego, czy n jest liczbą
pierwszą
a)
Przedstaw ten algorytm w formie opisu kolejnych kroków.
b) Zaprezentuj ten algorytm w formie schematu blokowego.
c)
Napisz program realizujący ten algorytm w wybranym przez siebie języku programowania (Pascal, C
lub C++). Oto przykład działania takiego programu:
Podaj liczbę naturalną: 2
Tak, jest to liczba pierwsza
Podaj liczbę naturalną: 22
Nie, nie jest to liczba pierwsza
d) Zaimplementuj ten algorytm w formie programu w języku Visual Basic lub skryptu w języku
JavaScript. Oto przykładowy projekt takiej aplikacji (poniżej po lewej) oraz komunikat, jaki powinien
pojawić się po kliknięciu na przycisku (poniżej po prawej):
Przykładowe rozwiązanie
Wszystkie podzielniki liczby n należą do zbioru {1, 2, ..., n – 1, n}. Jeśli n jest liczbą pierwszą, wtedy posiada
tylko podzielniki 1 oraz n. Zatem jeśli n posiada jakikolwiek podzielnik ze zbioru {2, ..., n – 1}, to znaczy że nie
jest ona liczba pierwszą. Jeśli natomiast nie ma ani jednego „niepożądanego” podzielnika, wtedy n jest pierwsza.
Działanie algorytmu opiera się zatem na sprawdzeniu, czy liczba n posiada jakiś niedozwolony podzielnik. W
najprostszej wersji algorytmu można sprawdzić wszystkie interesujące nas podzielniki, od 2 do n – 1. Będziemy
potrzebowali pomocniczej zmiennej p, reprezentującej kolejny podzielnik. Ponadto określamy, w jaki sposób
będziemy oznaczać działanie znajdowania reszty z dzielenia (symbol „mod”). Oto stosowne uzupełnienie
specyfikacji algorytmu:
Zmienna
pomocnicza:
Notacja:
liczba naturalna p – kolejny podzielnik liczby n
a mod b oznacza resztę z dzielenia liczby a przez liczbę b
Opis kolejnych kroków – pkt a)
Krok 1:
Wczytaj liczbę n.
Krok 2:
Zmiennej p przypisz wartość 2.
Krok 3:
Jeśli p jest równe n, wtedy wypisz komunikat „tak” i zakończ działanie
algorytmu. W przeciwnym razie przejdź do następnego kroku.
Krok 4:
Jeśli n mod p jest równe 0, wtedy wypisz komunikat „nie” i zakończ działanie
algorytmu.
Krok 5:
Powiększ wartość zmiennej p o 1 i przejdź do kroku 3.
Schemat blokowy – pkt b)
Start
Wczytaj n
p←2
NIE
p=n
?
TAK
Wypisz „tak”
NIE
p←p+1
n mod p = 0
?
TAK
Wypisz „nie”
Stop
Program w języku Pascal – pkt c)
program LiczbaPierwsza;
{ Sprawdzanie, czy wprowadzona liczba jest pierwsza }
var
n, p: integer;
begin
write('Podaj liczbę naturalną: ');
readln(n);
for p:=2 to n-1 do
if n mod p = 0 then
begin
writeln('Nie, nie jest to liczba pierwsza');
halt
end;
writeln('Tak, jest to liczba pierwsza')
end.
Uwaga: Procedura halt powoduje natychmiastowe zakończenie wykonywania pętli for i całego programu.
Program w języku C++ – pkt c)
// Sprawdzanie, czy wprowadzona liczba jest pierwsza
#include <iostream>
#include <stdlib>
main()
{
int n;
cout << "Podaj liczbę naturalną: ";
cin >> n;
for(int p=2; p<n; p++)
if(n % p == 0)
{
cout << "Nie, nie jest to liczba pierwsza" << endl;
exit(0);
}
cout << "Tak, jest to liczba pierwsza" << endl;
}
Uwaga: Funkcja exit powoduje natychmiastowe zakończenie wykonywania programu. Jej argumentem jest
liczba całkowita – kod zakończenia programu. Kod równy zeru oznacza prawidłowe zakończenie programu
(brak błędu wykonania). Wartość kodu jest szczególnie istotna, jeśli piszemy programy na potrzeby systemu
operacyjnego Linux.
Program w języku Visual Basic – pkt d)
Pole tekstowe, na którym użytkownik wpisuje
sprawdzaną liczbę, jest oznaczone jako Text1. Przycisk
uruchamiający procedurę sprawdzającą jest oznaczony
jako Command1. Komunikat wyświetlany jest przy
użyciu procedury MsgBox.
Oto procedura stowarzyszona z przyciskiem Command1:
Private Sub Command1_Click()
Dim n, p
n = Val(Text1.Text)
For p = 2 To n - 1
If n Mod p = 0 Then
MsgBox ("Nie")
Exit Sub
End If
Next p
MsgBox ("Tak")
End Sub
Program w języku JavaScript – pkt d)
Prezentujemy kompletny kod HTML strony WWW będącej rozwiązaniem zadania:
<html>
<head>
<script language=javascript>
function oblicz()
{
var n = eval(document.form1.n.value);
for(var p=2; p<n; p++)
if(n % p == 0)
{
alert("Nie");
return;
}
alert("Tak");
}
</script>
</head>
<body>
<h3 align=center>Liczba pierwsza</h3>
<center>
<form name=form1>
Wprowadź liczbę naturalną:
<input type=text size=5 name=n>
<br><br>
<input type=button
value="Sprawdź, czy jest pierwsza"
onClick=oblicz()>
</form>
</center>
</body>
</html>