Strona główna » Algorytmy » Artykuły » Zastąp Cyfre Liczbą
 

Zastąp Cyfre Liczbą

Cel

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.

Analiza zadania

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ść.

Przykładowa realizacja

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:

LiczbaCyframnbKomentarz
123-10Wartości początkowe
12313Dopisz wartość 3 do b i pomnóż mn przez 10
12104563Dopisujemy x pomnożony przez mn, a mn mnożymy 3 razy przez 10 (tyle co długość wstawianego fragmentu)
0110000145631 nie zostaje zmienione, więc dopisujemy z lewej strony

W wyniku przeprowadzenia operacji otrzymujemy liczbę 14563.

Implementacja

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.

  1. static int zastapCyfreLiczba(int a, int c, int x) {
  2.   int b = 0, mn = 1;
  3.   while (a != 0) {
  4.     int t = a % 10;
  5.     a /= 10;
  6.     if (t == c)
  7.       t = x;
  8.     b += t * mn;
  9.     mn *= (int) Math.Pow(10, (int)(Math.Log10(t) + 1));
  10.   }
  11.   return b;
  12. }

(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.

Testowanie funkcji

Jaś chcąc sprawdzić działanie napisanej funkcji mógłby skorzystać z poniższego fragmentu kodu:

  1. static void Main(string[] args) {
  2.   Console.Write("Podaj liczbę\n a = ");
  3.   int a = Convert.ToInt32(Console.ReadLine());
  4.   Console.Write("Podaj cyfrę do zastąpienia\n c = ");
  5.   int c = Convert.ToInt32(Console.ReadLine());
  6.   Console.Write("Podaj zamiennik cyfry {0}\n x = ", c);
  7.   int x = Convert.ToInt32(Console.ReadLine());
  8.   Console.WriteLine("Wynik to: {0}", zastapCyfreLiczba(a, c, x));
  9.   Console.ReadKey();
  10. }

Zadania

Zadanie 1

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.