Treści usunięte z lekcji zgodnie z podstawą programową
z 2024 r. sprawdź w e-booku podręcznika na eduranga.pl.

Film 1Programowanie w C++. Liczby pierwsze

W filmie omówiono algorytm sprawdzający, czy dana liczba jest pierwsza, oraz pokazano jego implementację.

Film 2Programowanie w C++. Badanie własności liczb całkowitych. Suma dzielników liczby

Film prezentuje zagadnienie złożoności czasowej algorytmu na przykładzie badania własności liczb całkowitych, a konkretnie badania sumy dzielników danej liczby.

Ćwiczenie 0

Zdefiniuj funkcję czy_parzysta(int n), której wynikiem jest 1 w przypadku, gdy liczba podana jako parametr jest parzysta, lub 0, gdy jest nieparzysta. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji czy_parzysta(1) jest 0.
  • Wynikiem funkcji czy_parzysta(2) jest 1.

Wskazówka
Zauważ, że algorytm sprawdzania parzystości liczby opiera się na badaniu reszty z dzielenia liczby przez 2. Jeśli ta reszta równa jest 0, to liczba jest parzysta, w przeciwnym wypadku – nieparzysta.

#include <iostream> using namespace std; // zdefiniuj funkcję bool czy_parzysta(int n) { } int main() { // sprawdź działanie funkcji cout << czy_parzysta(1) << " " << czy_parzysta(2) << endl; return 0; }
Wynikiem funkcji czy_parzysta(8) jest 1
return czy_parzysta(8)==1;
1
czy_parzysta(8)
Wynikiem funkcji czy_parzysta(13) jest 0
return czy_parzysta(13)==0;
0
czy_parzysta(13)
Wynikiem funkcji czy_parzysta(2468086420) jest 1
return czy_parzysta(2468086420)==1;
1
czy_parzysta(2468086420)
Rozwiąż ćwiczenie

Ćwiczenie 1Czy liczba jest pierwsza?

Zdefiniuj funkcję logiczną czy_pierwsza(int n), której parametrem jest liczba naturalna n większa od 1,
a wynikiem wartość 1, gdy jest ona liczbą pierwszą, albo 0, gdy nią nie jest. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji czy_pierwsza(11) jest 1.
  • Wynikiem funkcji czy_pierwsza(99) jest 0.
#include <iostream> using namespace std; // zdefiniuj funkcję bool czy_pierwsza(int n) { } int main() { // sprawdź działanie funkcji cout << czy_pierwsza(11) << " " << czy_pierwsza(99) << endl; return 0; }
Wynikiem funkcji czy_pierwsza(2) jest 1
return czy_pierwsza(2)==1;
1
czy_pierwsza(2)
Wynikiem funkcji czy_pierwsza(15555) jest 0
return czy_pierwsza(15555)==0;
0
czy_pierwsza(15555)
Wynikiem funkcji czy_pierwsza(7) jest 1
return czy_pierwsza(7)==1;
1
czy_pierwsza(7)
Rozwiąż ćwiczenie

Ćwiczenie 2N-ta liczba pierwsza

Zdefiniuj funkcję pierwsza(int n), której parametrem będzie liczba naturalna n, a wynikiem – n-ta liczba pierwsza. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji pierwsza(7) jest 17.
  • Wynikiem funkcji pierwsza(25) jest 97.
#include <iostream> using namespace std; // zdefiniuj funkcję bool czy_pierwsza(int i) { } // zdefiniuj funkcję int pierwsza(int n) { } int main() { // sprawdź działanie funkcji cout << pierwsza(7) << " " << pierwsza(25) << endl; return 0; }
Wynikiem funkcji pierwsza(1) jest 2
return pierwsza(1)==2;
2
pierwsza(1)
Wynikiem funkcji pierwsza(17) jest 59
return pierwsza(17)==59;
59
pierwsza(17)
Wynikiem funkcji pierwsza(100) jest 541
return pierwsza(100)==541;
541
pierwsza(100)
Rozwiąż ćwiczenie

Ćwiczenie 3Liczby bliźniacze

Liczby bliźniacze to liczby pierwsze różniące się o 2. W pierwszej setce jest osiem par takich liczb: 3 i 5, 5 i 7, 11 i 13, 17 i 19, 29 i 31, 41 i 43, 59 i 61, 71 i 73. Zdefiniuj funkcję blizniacze(int n), której parametrem jest liczba naturalna n, a wynikiem pierwsza liczba z n-tej pary liczb bliźniaczych. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji blizniacze(3) jest 11.
  • Wynikiem funkcji blizniacze(7) jest 59.
#include <iostream> using namespace std; // zdefiniuj funkcję int blizniacze(int n) { } int main() { // sprawdź działanie funkcji cout << blizniacze(3) << " " << blizniacze(7) << endl; return 0; }
Wynikiem funkcji blizniacze(1) jest 3
return blizniacze(1)==3;
3
blizniacze(1)
Wynikiem funkcji blizniacze(2) jest 5
return blizniacze(2)==5;
5
blizniacze(2)
Wynikiem funkcji blizniacze(10) jest 107
return blizniacze(10)==107;
107
blizniacze(10)
Rozwiąż ćwiczenie

Ćwiczenie 4Suma dzielników liczby

Zdefiniuj funkcję suma_dzielnikow(int n), której parametrem jest liczba naturalna n, a wynikiem – suma dzielników tej liczby. Sformułuj dwa algorytmy i porównaj szybkość działania każdego z nich dla różnych danych. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji suma_dzielnikow(7) jest 8.
  • Wynikiem funkcji suma_dzielnikow(16) jest 31.

Algorytm sprawdzający podzielność danej liczby przez kolejne liczby naturalne – od 1 do niej samej.

#include <iostream> using namespace std; // zdefiniuj funkcję int suma_dzielnikow(int n) { } int main() { // sprawdź działanie funkcji cout << suma_dzielnikow(7) << " " << suma_dzielnikow(16) << endl; return 0; }
Wynikiem funkcji suma_dzielnikow(2) jest 3
return suma_dzielnikow(2)==3;
3
suma_dzielnikow(2)
Wynikiem funkcji suma_dzielnikow(5) jest 6
return suma_dzielnikow(5)==6;
6
suma_dzielnikow(5)
Wynikiem funkcji suma_dzielnikow(100) jest 217
return suma_dzielnikow(100)==217;
217
suma_dzielnikow(100)
Rozwiąż ćwiczenie

Algorytm sprawdzający podzielność danej liczby przez kolejne dzielniki od 2 do pierwiastka z tej liczby.

#include <iostream> #include <cmath> using namespace std; // zdefiniuj funkcję int suma_dzielnikow(int n) { } int main() { // sprawdź działanie funkcji cout << suma_dzielnikow(7) << " " << suma_dzielnikow(16) << endl; return 0; }
Wynikiem funkcji suma_dzielnikow(2) jest 3
return suma_dzielnikow(2)==3;
3
suma_dzielnikow(2)
Wynikiem funkcji suma_dzielnikow(5) jest 6
return suma_dzielnikow(5)==6;
6
suma_dzielnikow(5)
Wynikiem funkcji suma_dzielnikow(100) jest 217
return suma_dzielnikow(100)==217;
217
suma_dzielnikow(100)
Rozwiąż ćwiczenie

Ćwiczenie 5Liczby zaprzyjaźnione

Liczby zaprzyjaźnione to dwie liczby naturalne, z których każda jest równa sumie dzielników właściwych drugiej liczby (np. suma dzielników właściwych liczby 220 wynosi 284, a suma dzielników właściwych liczby 284 – 220). Zdefiniuj funkcję zaprzyjaznione(int n), której parametrem jest liczba naturalna n, a wynikiem – mniejsza liczba z n-tej pary liczb zaprzyjaźnionych. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji zaprzyjaznione(1) jest 220.
  • Wynikiem funkcji zaprzyjaznione(3) jest 2620.
#include <iostream> #include <cmath> using namespace std; // zdefiniuj funkcję int suma_dzielnikow_w(int n) { } // zdefiniuj funkcję int zaprzyjaznione(int n) { } int main() { // sprawdź działanie funkcji cout << zaprzyjaznione(1) << " " << zaprzyjaznione(3) << endl; return 0; }
Wynikiem funkcji zaprzyjaznione(5) jest 6232
return zaprzyjaznione(5)==6232;
6232
zaprzyjaznione(5)
Wynikiem funkcji zaprzyjaznione(2) jest 1184
return zaprzyjaznione(2)==1184;
1184
zaprzyjaznione(2)
Wynikiem funkcji zaprzyjaznione(7) jest 12285
return zaprzyjaznione(7)==12285;
12285
zaprzyjaznione(7)
Rozwiąż ćwiczenie

Ćwiczenie dodatkowe 1

Zdefiniuj funkcję parzyste(int liczba1, int liczba2), której parametrami są liczby całkowite dodatnie, przy czym liczba1 < liczba2, a ich różnica wynosi co najmniej 3. Wynikiem funkcji jest suma dwóch liczb – najmniejszej liczby parzystej większej od parametru liczba1 i największej liczby parzystej mniejszej od parametru liczba2. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji parzyste(4, 9) jest 14.
  • Wynikiem funkcji parzyste(9, 12) jest 20.
  • Wynikiem funkcji parzyste(14, 75) jest 90.
#include <iostream> using namespace std; // zdefiniuj funkcję int parzyste(int liczba1,int liczba2) { } int main() { // sprawdź działanie funkcji cout << parzyste(4, 9) << " " << parzyste(9, 12) << endl; return 0; }
Wynikiem funkcji parzyste(1, 9999) jest 10000
return parzyste(1, 9999)==10000;
10000
parzyste(1, 9999)
Wynikiem funkcji parzyste(89898, 89901) jest 179800
return parzyste(89898, 89901)==179800;
179800
parzyste(89898, 89901)
Wynikiem funkcji parzyste(10, 1000000) jest 1000010
return parzyste(10, 1000000)==1000010;
1000010
parzyste(10, 1000000)
Rozwiąż ćwiczenie

Ćwiczenie dodatkowe 2

Zdefiniuj funkcję nieparzyste(int n), której wynikiem jest liczba liczb nieparzystych podzielnych przez 7 nie większych od parametru n. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji nieparzyste(30) jest 2.
  • Wynikiem funkcji nieparzyste(35) jest 3.
  • Wynikiem funkcji nieparzyste(100) jest 7.
#include <iostream> using namespace std; // zdefiniuj funkcję int nieparzyste(int n) { } int main() { // sprawdź działanie funkcji cout << nieparzyste(30) << " " << nieparzyste(35) << endl; return 0; }
Wynikiem funkcji nieparzyste(300) jest 21
return nieparzyste(300)==21;
21
nieparzyste(300)
Wynikiem funkcji nieparzyste(999) jest 71
return nieparzyste(999)==71;
71
nieparzyste(999)
Wynikiem funkcji nieparzyste(987621) jest 70544
return nieparzyste(987621)==70544;
70544
nieparzyste(987621)
Rozwiąż ćwiczenie

Ćwiczenie dodatkowe 3

Zdefiniuj funkcję dwie(int liczba), której wynikiem jest suma cyfr jedności i dziesiątek danej liczby powiększona o 1, gdy suma okazała się liczbą nieparzystą, lub zmniejszona o 1, gdy suma okazała się liczbą parzystą. Parametr liczba przyjmuje wartości z zakresu od 10 do 1 000 000. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji dwie(1284456) jest 12.
  • Wynikiem funkcji dwie(892339) jest 11.
#include <iostream> using namespace std; // zdefiniuj funkcję int dwie(int liczba) { } int main() { // sprawdź działanie funkcji cout << dwie(1284456) << " " << dwie(892339) << endl; return 0; }
Wynikiem funkcji dwie(11) jest 1
return dwie(11)==1;
1
dwie(11)
Wynikiem funkcji dwie(1221) jest 4
return dwie(1221)==4;
4
dwie(1221)
Wynikiem funkcji dwie(3488677) jest 13
return dwie(3488677)==13;
13
dwie(3488677)
Rozwiąż ćwiczenie

Zadanie 1Liczby ciekawe

Zdefiniuj funkcję ciekawa(int n), której parametrem jest liczba naturalna n, a wynikiem – większa od podanego parametru pierwsza liczba nieparzysta, która ma nieparzystą liczbę dzielników. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji ciekawa(4) jest 9.
  • Wynikiem funkcji ciekawa(19) jest 25.
#include <iostream> #include <cmath> using namespace std; // zdefiniuj funkcję int ciekawa(int n) { } int main() { // sprawdź działanie funkcji cout << ciekawa(4) << " " << ciekawa(19) << endl;     return 0; }
Wynikiem funkcji ciekawa(1) jest 9
return ciekawa(1)==9;
9
ciekawa(1)
Wynikiem funkcji ciekawa(2) jest 9
return ciekawa(2)==9;
9
ciekawa(2)
Wynikiem funkcji ciekawa(100) jest 121
return ciekawa(100)==121;
121
ciekawa(100)
Rozwiąż ćwiczenie

Zadanie 2Liczby czworacze

Liczby czworacze to liczby pierwsze mające postać: n, n + 2, n + 6 i n + 8. Zdefiniuj funkcję czworacze(int n), której parametrem jest liczba naturalna n, a wynikiem – pierwsza liczba z liczb czworaczych, która jest większa od podanego parametru. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji czworacze(9) jest 11.
  • Wynikiem funkcji czworacze(150) jest 191.
#include <iostream> using namespace std; // zdefiniuj funkcję bool czy_pierwsza(int n) { } // zdefiniuj funkcję int czworacze(int n) { } int main() { // sprawdź działanie funkcji cout << czworacze(9) << " " << czworacze(150) << endl;     return 0; }
Wynikiem funkcji czworacze(1) jest 5
return czworacze(1)==5;
5
czworacze(1)
Wynikiem funkcji czworacze(5) jest 11
return czworacze(5)==11;
11
czworacze(5)
Wynikiem funkcji czworacze(100) jest 101
return czworacze(100)==101;
101
czworacze(100)
Rozwiąż ćwiczenie

Zadanie 3Problem Collatza

Pierwsza liczba ciągu Collatza jest dowolną liczbą naturalną x, a każda kolejna wartość ciągu obliczana jest na podstawie poprzedniej według poniższych zasad:

  • jeśli poprzednia wartość była parzysta, to należy podzielić ją przez 2;
  • jeśli poprzednia wartość była nieparzysta, to należy pomnożyć ją przez 3 i dodać 1.

Przypuszcza się, że niezależnie od której liczby naturalnej zaczniemy, zawsze po pewnej skończonej liczbie kroków otrzymamy liczbę 1. (Udowodniono to dla liczb mniejszych niż kilka tryliardów).

Zdefiniuj funkcję collatz(int x), której parametrem jest liczba naturalna x, czyli wartość początkowa ciągu liczb Collatza, a wynikiem – liczba kroków, po których w ciągu pojawi się liczba 1. Sprawdź działanie funkcji dla podanych poniżej parametrów.

  • Wynikiem funkcji collatz(10) jest 6.
  • Wynikiem funkcji collatz(15) jest 17.
#include <iostream> using namespace std; // zdefiniuj funkcję int collatz(int x) { } int main() { // sprawdź działanie funkcji cout << collatz(10) << " " << collatz(15) << endl;     return 0; }
Wynikiem funkcji collatz(1) jest 0
return collatz(1)==0;
0
collatz(1)
Wynikiem funkcji collatz(2) jest 1
return collatz(2)==1;
1
collatz(2)
Wynikiem funkcji collatz(20) jest 7
return collatz(20)==7;
7
collatz(20)
Rozwiąż ćwiczenie

Zadanie 4Suma kwadratów cyfr

Polski matematyk Hugo Steinhaus zauważył, że jeśli zsumujemy kwadraty cyfr wybranej liczby naturalnej, a następnie będziemy sumować kwadraty cyfr kolejnych otrzymanych liczb, to w pewnym momencie zawsze otrzymamy 1 lub 4. Zdefiniuj funkcję suma_kwadratow(int n), której wynikiem będzie suma kwadratów cyfr liczby podanej jako parametr. Przetestuj działanie dla liczby 123 i kilku innych liczb początkowych.

#include <iostream> using namespace std; // zdefiniuj funkcję int suma_kwadratow(int n) { } int main() { // sprawdź działanie funkcji cout << suma_kwadratow(123) << " " << suma_kwadratow(14) << endl; cout << suma_kwadratow(17) << " " << suma_kwadratow(50) << endl;     return 0; }
Wynikiem funkcji suma_kwadratow(14) jest 17
return suma_kwadratow(14)==17;
17
suma_kwadratow(14)
Wynikiem funkcji suma_kwadratow(20) jest 4
return suma_kwadratow(20)==4;
4
suma_kwadratow(20)
Wynikiem funkcji suma_kwadratow(100) jest 1
return suma_kwadratow(100)==1;
1
suma_kwadratow(100)
Rozwiąż ćwiczenie

Pytania quizoweBadanie własności liczb całkowitych

Twój wynik to: /3
  • Co określa czasowa złożoność obliczeniowa?
  • W jakim przedziale algorytm optymalny będzie szukał dzielników liczby 10 000?
  • Jak nazywa się algorytm znajdowania liczb pierwszych w podanym zakresie?