Rozwiniecie dziesietne

Zadania niepasujące do innych kategorii.
Otrzymałeś(aś) rozwiązanie do zamieszczonego zadania? - podziękuj autorowi rozwiązania! Kliknij
Trinity
Dopiero zaczynam
Dopiero zaczynam
Posty: 12
Rejestracja: 05 mar 2017, 17:12
Podziękowania: 12 razy
Płeć:

Rozwiniecie dziesietne

Post autor: Trinity »

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 :) .
Awatar użytkownika
panb
Expert
Expert
Posty: 5122
Rejestracja: 26 kwie 2010, 22:54
Lokalizacja: Nowiny Wielkie
Podziękowania: 19 razy
Otrzymane podziękowania: 2053 razy
Płeć:

Post autor: panb »

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.
n=123, p=3
  • 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}\)
Mam nadzieję, że to wyjaśnia o co chodzi z rozwinięciami liczby o danej podstawie.
arksoftware
Rozkręcam się
Rozkręcam się
Posty: 39
Rejestracja: 24 maja 2016, 11:44
Otrzymane podziękowania: 9 razy
Płeć:

Post autor: arksoftware »

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.
Matematyka: Generator zadań - darmowa apka dla Androida generuje losowe zadania i pokazuje pełne rozwiązania
ODPOWIEDZ