1059 - Schimb Cifre
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>