Witam, mam problem ze zrozumieniem:
dane sa dwie liczby calkowite n i liczba p spelniajaca: \(2 \le p \le 10\)
zapisz algorytm problemu polegajacego na otrzymaniu cyfr rozwiniecia liczby n przy podstawie p i wypisaniu ich w kolejnosci od najbardziej znaczacej.
funkcja rekurencyjna wyglada tak:
void kolejnacyfra(int n, int p)
{if (n>0)
{
kolejnacyfra(\(\frac{n}{p}\) ,p)
cout << n%p;
}
}
problem jest w tym ze w ogole nie potrafie zrozumiec o co chodzi z tym rozwinieciem, i z tym co dzieje sie w tej funkcji, bylbym baardzo wdzieczny gdyby ktos to wytlumaczyl, najlepiej na przykladach, bo nigdy nie wiadomo co na maturze mozna spotkac .
Rozwiniecie dziesietne
Otrzymałeś(aś) rozwiązanie do zamieszczonego zadania? - podziękuj autorowi rozwiązania! Kliknij
- panb
- Expert
- Posty: 5122
- Rejestracja: 26 kwie 2010, 22:54
- Lokalizacja: Nowiny Wielkie
- Podziękowania: 19 razy
- Otrzymane podziękowania: 2053 razy
- Płeć:
n=26, p=3
- Trzeba zapisać liczbę 26 w systemie trójkowym.
29:3=9 r 2, 9:3=3 r 0, 3:3=1 r 0 \(\So (29)_{10}=(0102)_3=(102)_{3}\).
Najbardziej znaczącą cyfrą jest 1.
- Trzeba zapisać liczbę 123 w systemie trójkowym.
123:3=41 r 0, 41:3=13 r 2, 13:3=4 r 1, 4:3=1 r 1 \(\So (123)_{10}=(11120)_{3}\)
-
- Rozkręcam się
- Posty: 39
- Rejestracja: 24 maja 2016, 11:44
- Otrzymane podziękowania: 9 razy
- Płeć:
Poczytaj trochę o pozycyjnych systemach zapisu liczby (np. tu: https://pl.wikipedia.org/wiki/Systemy_pozycyjne).
Dla przykładu liczba 17 jest tak zapisana w systemie dziesiętnym, którego wszyscy używają na codzień, ponieważ \(1 \cdot 10^1 + 7 \cdot 10^0 = 17\)
W systemie dwójkowym ta sama liczba byłaby zapisana jako 10001, ponieważ \(1 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 = 17\)
W systemie szesnastkowym byłoby to 11, ponieważ \(1 \cdot 16^1 + 1 \cdot 16^0 = 17\)
Teraz, twoje zadanie polega na tym, żeby napisać program / algorytm, który zapisze daną liczbę n w systemie o podstawie p. Można do tego podejść na kilka sposobów, ty zaprezentowałeś rozwiązanie rekurencyjne. W rekurencji chodzi o to, że funkcja woła samą siebie z innymi argumentami, co czasami pozwala mocno uprościć program.
Przyjmijmy na chwilę uproszczenie, że n jest liczbą naturalną dodatnią.
Ostatnią cyfrą w zapisie liczby n w systemie o podstawie p jest reszta z dzielenia n%p (n modulo p). Natomiast wszystkie cyfry oprócz ostatniej tworzą liczbę n/p (dzielenie całkowitoliczbowe, resztę odrzucamy). Pozostaje jeszcze sprawdzenie, kiedy skończyć algorytm (nie wypisujemy nieskończonej liczby zer po lewej stronie). Dlatego algorytm można przestawić następująco:
Algorytm A:
1. Jeśli argument jest większy od zera, wróć.
2. Zapisz wszystkie cyfry oprócz ostatniej używając algorytmu A dla liczby n/p.
3. Zapisz ostatnią cyfrę, która wynosi n%p.
To przekłada się na kod w języku C, który zapisałeś w pytaniu.
Pozostaje jeszcze kwestia, co jeśli n jest liczbą całkowitą, niekoniecznie dodatnią. Dojdą dodatkowe warunki dla zera i dla wypisywania minusa.
Dla przykładu liczba 17 jest tak zapisana w systemie dziesiętnym, którego wszyscy używają na codzień, ponieważ \(1 \cdot 10^1 + 7 \cdot 10^0 = 17\)
W systemie dwójkowym ta sama liczba byłaby zapisana jako 10001, ponieważ \(1 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 = 17\)
W systemie szesnastkowym byłoby to 11, ponieważ \(1 \cdot 16^1 + 1 \cdot 16^0 = 17\)
Teraz, twoje zadanie polega na tym, żeby napisać program / algorytm, który zapisze daną liczbę n w systemie o podstawie p. Można do tego podejść na kilka sposobów, ty zaprezentowałeś rozwiązanie rekurencyjne. W rekurencji chodzi o to, że funkcja woła samą siebie z innymi argumentami, co czasami pozwala mocno uprościć program.
Przyjmijmy na chwilę uproszczenie, że n jest liczbą naturalną dodatnią.
Ostatnią cyfrą w zapisie liczby n w systemie o podstawie p jest reszta z dzielenia n%p (n modulo p). Natomiast wszystkie cyfry oprócz ostatniej tworzą liczbę n/p (dzielenie całkowitoliczbowe, resztę odrzucamy). Pozostaje jeszcze sprawdzenie, kiedy skończyć algorytm (nie wypisujemy nieskończonej liczby zer po lewej stronie). Dlatego algorytm można przestawić następująco:
Algorytm A:
1. Jeśli argument jest większy od zera, wróć.
2. Zapisz wszystkie cyfry oprócz ostatniej używając algorytmu A dla liczby n/p.
3. Zapisz ostatnią cyfrę, która wynosi n%p.
To przekłada się na kod w języku C, który zapisałeś w pytaniu.
Pozostaje jeszcze kwestia, co jeśli n jest liczbą całkowitą, niekoniecznie dodatnią. Dojdą dodatkowe warunki dla zera i dla wypisywania minusa.
Matematyka: Generator zadań - darmowa apka dla Androida generuje losowe zadania i pokazuje pełne rozwiązania