1059 - Schimb Cifre

From Bitnami MediaWiki
Revision as of 13:16, 17 March 2023 by Tamas Claudia (talk | contribs) (Pagină nouă: Sursă: [https://www.pbinfo.ro/probleme/1059/schimbcifre] == Cerinţa == Se dă un număr natural '''numar'''. Asupra lui se efectuează '''serii_transformari''' serii de transformări, o serie constând în '''interschimbari''' 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 '''serii_transformari''' serii de transformări. == Date de intrare == Programul citește de la tastat...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursă: [1]

Cerinţa

Se dă un număr natural numar. Asupra lui se efectuează serii_transformari serii de transformări, o serie constând în interschimbari 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 serii_transformari serii de transformări.

Date de intrare

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

Date de ieşire

Programul va afișa pe ecran numărul obținut în urma efectuării celor serii_transformari serii de transformări.

Restricții și precizări

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

Exemplu

Intrare
1234 2 2
2 4
1 4
Ieșire
4132

Explicație

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

Rezolvare

<syntaxhighlight lang="python" line> numar, serii_transformari, interschimbari = map(int, input().split())

k = numar p = 0 sab = 0

while k != 0:

   k //= 10
   p += 1
   sab = sab * 10 + p

for k in range(1, interschimbari + 1):

   i, j = map(int, input().split())
   if i > j:
       i, j = j, i
   pi = 1
   pj = 1
   for v in range(1, p - i + 1):
       pi *= 10
   for v in range(1, p - j + 1):
       pj *= 10
   ci = (sab // pi) % 10
   cj = (sab // pj) % 10
   sab -= ci * pi
   sab -= cj * pj
   sab += cj * pi
   sab += ci * pj

k = 0 nr = numar

while True:

   k += 1
   a = sab
   suma = 0
   prod = 1
   while a != 0:
       r = a % 10
       pc = 1
       for i in range(1, p - r + 1):
           pc *= 10
       c = (nr // pc) % 10
       suma += c * prod
       prod *= 10
       a //= 10
   nr = suma
   if nr == numar:
       break

serii_transformari %= k nr = numar

for i in range(1, serii_transformari + 1):

   a = sab
   suma = 0
   prod = 1
   while a != 0:
       r = a % 10
       pc = 1
       for j in range(1, p - r + 1):
           pc *= 10
       c = (nr // pc) % 10
       suma += c * prod
       prod *= 10
       a //= 10
   nr = suma

print(nr)


</syntaxhighlight>