W pewnej liczbie całkowitej Jaś postanowił zamienić wszystkie wystąpienia pewnej wybranej cyfry na inną liczbę. Napisz dla niego program, który wykona taką zamianę i pokaże wynik, aby sprawdził swoje obliczenia. Napisana funkcja powinna wyznaczać wynik w sposób efektywny i wykorzystując jedynie operacje arytmetyczne.
Przykładowo zamieniając cyfrę 3 w liczbie 123 na 21 otrzymamy 1221. Bardziej skomplikowanym przypadkiem jest zamiana w liczbie 12121 cyfry 1 na 78. Wynikiem tej operacji podmianki będzie 78278278. Oczywiście w przypadku, gdy podmieniana cyfra nie występuje w liczbie to w liczbie nic się nie zmienia tj. zamiana 4 w liczbie 123 na 9 nie wprowadza żadnych zmian.
Większość języków programowania pozwala na konwersję liczby na tekst, zamianę fragmentu tekstu na inny, a następnie ponowną konwersję tekstu na liczbę. Rozwiązanie bardzo krótkie i proste, ale niezbyt efektywne. Ponadto nie spełnia założeń, że należy wykorzystać jedynie operacje arytmetyczne!
W celu wybierania kolejnych cyfr z liczby należy skorzystać z operacji modulo, a usuwać ostatnią cyfrę poprzez dzielenie liczby przez 10 i obcięcie częście ułamkowej. W przypadku, gdy wybrana cyfra jest podmienianą cyfrą to należy w jej miejsce wstawić liczbę x. Jednak to co wstawiamy należy wstawić z lewej strony, a nie z prawej, ponieważ liczba zostanie wtedy zapisana wspak. W tym celu warto zadeklarować dodatkową zmienną, która będzie "przesuwać" wstawianą wartość.
W liczbie 123 będziemy zamieniać 2 na 456. W tym celu deklarujemy pomocniczą zmienną b - do przechowania wyniku oraz mn - do przesuwania liczb (będą to kolejne potęgi 10), początkowo ma wartość 1. Kolejno zostanie wykonane:
Liczba | Cyfra | mn | b | Komentarz |
---|---|---|---|---|
123 | - | 1 | 0 | Wartości początkowe |
12 | 3 | 1 | 3 | Dopisz wartość 3 do b i pomnóż mn przez 10 |
1 | 2 | 10 | 4563 | Dopisujemy x pomnożony przez mn, a mn mnożymy 3 razy przez 10 (tyle co długość wstawianego fragmentu) |
0 | 1 | 10000 | 14563 | 1 nie zostaje zmienione, więc dopisujemy z lewej strony |
W wyniku przeprowadzenia operacji otrzymujemy liczbę 14563.
Poniższa funkcja zastapCyfreLiczba() realizuje przedstawiony wyżej algorytm. Kolejne argumenty to: a - liczba w której ma zostać podmieniona cyfra, c - cyfra do zamiany oraz x - wartość na jaką zamienić c.
(2.) Początkowo wynik b to 0, a mnożnik mn wynosi 1. (3.) Dopóki istnieją cyfry do rozpatrzenia to: (4.) pobierz cyfrę i (5.) usuń ją z liczby. Jeśli (6.) dana cyfra ma zostać zamieniona to (7.) podmień wartość do wstawienia. Następnie (8.) wstaw liczbę t do b oraz (9.) zaktualizuj mnożnik. Na koniec zwróć obliczoną wartość b.
Jaś chcąc sprawdzić działanie napisanej funkcji mógłby skorzystać z poniższego fragmentu kodu:
Napisz funkcję zastapLiczbeLiczba(), która w pewnej liczbie a zastąpi liczbę x na pewną wartość y. Przykładowo w 23123 zamiana 23 na 45 zwróci liczbę 45145. W przypadku, gdy liczba to np. 32323 i do zamiany jest 323 na 4 to poprawnym wynikiem jest 324. Innymi słowy fragmenty są zamieniane w kolejności od prawej do lewej. Przetestuj działanie napisanego kodu.