1059 - Schimb Cifre

From Bitnami MediaWiki

Sursă: [1]

Cerinţa[edit | edit source]

Se dă un număr natural n. Asupra lui se efectuează s serii de transformări, o serie constând în t transformări de genul: cifra de pe poziția i se interschimbă cu cifra de pe poziția j. Să se afişeze numărul obţinut după efectuarea celor s serii de transformări.

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele n, s și t, iar apoi t perechi de numere naturale, separate prin spații, fiecare pereche reprezentând pozițiile cifrelor care se interschimbă.

Date de ieşire[edit | edit source]

Dacă datele introduse sunt corecte, pe ecran se va afișa "Datele introduse sunt corecte.", apoi programul va afișa pe ecran numărul obținut în urma efectuării celor s serii de transformări. În caz contrar, se va afișa pe ecran mesajul "Datele introduse nu sunt corecte.".

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 1.000.000.000
  • 1 ⩽ s ⩽ 2.000.000.000
  • 1 ⩽ t ⩽ 10
  • prima cifră din scrierea lui n se află pe poziția 1
  • numerele din cele t perechi reprezentând pozițiile cifrelor care se interschimbă sunt mai mici sau egale cu numărul cifrelor lui n
  • cifra 0 nu va ajunge pe prima poziţie în urma unei interschimbări

Exemplu[edit | edit source]

Intrare
1234 2 2
2 4
1 4
Ieșire
Datele introduse sunt corecte.
4132

Explicație[edit | edit source]

Se efectuează prima serie de transformări: 1234 → 1432 → 2431 A doua serie de transformări: 2431 → 2134 → 4132

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1059

from typing import List, Tuple

  1. Funcție de verificare a datelor conform restricțiilor

def verificare_date(n: int, s: int, t: int, interschimbari: List[Tuple[int, int]]) -> bool:

   # Verificare restricție n
   if n < 1 or n > 1000000000:
       return False
   # Verificare restricție s
   if s < 1 or s > 2000000000:
       return False
   # Verificare restricție t
   if t < 1 or t > 10:
       return False
   # Verificare restricție interschimbari
   for i, j in interschimbari:
       if i < 1 or i > len(str(n)) or j < 1 or j > len(str(n)):
           return False
   return True


  1. Funcție pentru interschimbarea cifrelor la pozițiile i și j într-un număr

def interschimbare_cifre(numar: int, i: int, j: int) -> int:

   cifre = [int(cifra) for cifra in str(numar)]
   cifre[i-1], cifre[j-1] = cifre[j-1], cifre[i-1]
   return int("".join(map(str, cifre)))


  1. Funcția main

if __name__ == "__main__":

   # Citire date de intrare
   n, s, t = map(int, input("Introduceti datele separate prin spatii: ").split())
   interschimbari = []
   for i in range(t):
       i, j = map(int, input("Introduceti datele separate prin spatii: ").split())
       interschimbari.append((i, j))
   # Verificare date de intrare
   if not verificare_date(n, s, t, interschimbari):
       print("Datele introduse nu sunt corecte.")
       exit()
   # Efectuare serii de transformări
   for k in range(s):
       for i, j in interschimbari:
           if i > j:
               i, j = j, i
           n = interschimbare_cifre(n, i, j)
   # Afișare rezultat
   print("Datele introduse sunt corecte.")
   print(n)


</syntaxhighlight>