Matura 2011 (maj). Zadanie 2. Potęgowanie
Dana jest następująca specyfikacja oraz algorytm obliczania potęgi o wykładniku naturalnym:
Specyfikacja:
Dane: liczba rzeczywista a oraz liczba naturalna n, n ≠ 0
Wynik: liczba rzeczywista p = an = a * a * a * … * a (n razy)
Algorytm:
krok 1. p = 1 , b = a
krok 2. dopóki n > 0 wykonuj:
a) jeśli a mod 2 ≠ 0, to p = p * b
b) b = b * b
c) n = n div 2
Uwaga:
n div 2 oznacza wynik dzielenia całkowitego n przez 2, a n mod 2 oznacza resztę z dzielenia całkowitego n przez 2.
- Przeanalizuj podany algorytm i uzupełnij tabelę wartościami zmiennych p, b oraz n po kolejnych wykonaniach kroku 2 dla dowolnej początkowej wartości a oraz dla początkowej wartości zmiennej n równej 12.
| p | b | n |
| 1 | a | 12 |
| 1 | a2 | 6 |
| 1 | a4 | 3 |
| a4 | a8 | 1 |
| a12 | a16 | 0 |
Opis:
Algorytm w języku c++:
#include <iostream>
using namespace std;
int main()
{
double a;
int n;
cout << "Podaj a: ";
cin >> a;
cout << "Podaj n: ";
cin >> n;
double p=1, b=a;
cout << " n = " << n << " b = " << b << " p = " << p << endl;
while (n>0) {
if (n%2!=0) p=p*b;
b=b*b;
n=n/2;
cout << " n = " << n << " b = " << b << " p = " << p << endl;
}
return 0;
}
Komentarz:
Z algorytmu wynika, iż zmienna b jest podnoszona do kwadratu, czyli b=b*b daje nam: a, a2, a4, a8, a16, a32, itd. Pod b jest podstawiana wartość zmiennej a.
Pod zmienną n przypisywane jest dzielenie całkowite, tzn. dzielenie dwóch liczb całkowitych, gdzie wynikiem jest liczba całkowita.
n=12/2, n=6
n=6/2, n=3
n=3/2, n=1
n=1/2, n=0
Zmienna p jest zwiększana, tylko wtedy gdy zmienna n jest nieparzysta oraz jest zwiększana tyle razy, ile ma wartość zmienna b w danym kroku.
- Uzupełnij poniższą tabelę, wpisując liczby wszystkich mnożeń, wykonywanych przez powyższy algorytm dla podanych wartości n, tzn. liczby wykonanych instrukcji p = p * b i b = b * b.
| n | liczba mnożeń |
| 2 | 3 |
| 3 | 4 |
| 4 | 4 |
| 5 | 5 |
| 6 | 5 |
| 7 | 6 |
Opis:
Algorytm w języku c++:
#include <iostream>
using namespace std;
int main()
{
double a;
int n;
cout << "Podaj a: ";
cin >> a;
cout << "Podaj n: ";
cin >> n;
cout << "n = " << n;
double p=1, b=a;
int ile=0;
while (n>0) {
if (n%2!=0) {
p=p*b;
ile++;
}
b=b*b;
ile++;
n=n/2;
}
cout << " Mnozen = " << ile << endl;
return 0;
}
Komentarz:
W naszym algorytmie mnożeń, czyli instrukcja b=b*b wykonywana jest tyle ile razy pętla while, zaś instrukcja p=p*b jest wykonywana tyle ile razy instrukcja if.
- Podkreśl funkcję, której wartość jest równa liczbie mnożeń wykonywanych przez powyższy algorytm dla wartości n będącej potęgą dwójki:
- ƒ(n) = 2 + log2n
- ƒ(n) = 1 + n
- ƒ(n) = 2n2 – 1
- ƒ(n) = 2n
Opis:
rozwiązując funkcje dla n = 2, 3, 4, 5 ,6 daje nam:
ƒ(n) = 2 + log2n
ƒ(2) = 2 + log22 = 2 + 1 = 3
ƒ(4) = 2 + log24 = 2 + 2 = 4
ƒ(n) = 1 + n
ƒ(2) = 1 + 2 = 3
ƒ(3) = 4
ƒ(4) = 5
ƒ(5) = 6
ƒ(6) = 7
ƒ(n) = 2n2 – 1
ƒ(2) = 2 * 22 – 1 = 7
ƒ(3) = 17
ƒ(4) = 31
ƒ(5) = 49
ƒ(6) = 71
ƒ(n) = 2n
ƒ(2) = 22 = 4
ƒ(3) = 8
ƒ(4) = 16
ƒ(5) = 32
ƒ(6) = 64