1059 - Schimb Cifre: Difference between revisions

From Bitnami MediaWiki
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...
 
No edit summary
 
Line 2: Line 2:


== Cerinţa ==
== 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.
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 ==
== 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ă.
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 ==
== 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.
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 ==
== Restricții și precizări ==
* ''' 1 ⩽ numar ⩽ 1.000.000.000 '''
* ''' 1 ⩽ n ⩽ 1.000.000.000 '''
* ''' 1 ⩽ serii_transformari ⩽ 2.000.000.000'''
* ''' 1 ⩽ s ⩽ 2.000.000.000'''
* ''' 1 ⩽ interschimbari ⩽ 10 '''
* ''' 1 ⩽ t ⩽ 10 '''
* prima cifră din scrierea lui '''numar''' se află pe poziția 1
* prima cifră din scrierea lui '''n''' 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'''
* 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
* cifra '''0''' nu va ajunge pe prima poziţie în urma unei interschimbări


Line 21: Line 21:
: 1 4
: 1 4
; Ieșire
; Ieșire
: Datele introduse sunt corecte.
: 4132
: 4132
   
   
Line 30: Line 31:


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


k = numar
from typing import List, Tuple
p = 0
sab = 0


while k != 0:
# Funcție de verificare a datelor conform restricțiilor
     k //= 10
def verificare_date(n: int, s: int, t: int, interschimbari: List[Tuple[int, int]]) -> bool:
     p += 1
     # Verificare restricție n
    sab = sab * 10 + p
     if n < 1 or n > 1000000000:
        return False


for k in range(1, interschimbari + 1):
    # Verificare restricție s
    i, j = map(int, input().split())
    if s < 1 or s > 2000000000:
        return False


     if i > j:
    # Verificare restricție t
         i, j = j, i
     if t < 1 or t > 10:
         return False


     pi = 1
     # Verificare restricție interschimbari
     pj = 1
     for i, j in interschimbari:
        if i < 1 or i > len(str(n)) or j < 1 or j > len(str(n)):
            return False


     for v in range(1, p - i + 1):
     return True
        pi *= 10


    for v in range(1, p - j + 1):
        pj *= 10


     ci = (sab // pi) % 10
# Funcție pentru interschimbarea cifrelor la pozițiile i și j într-un număr
     cj = (sab // pj) % 10
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)))


    sab -= ci * pi
    sab -= cj * pj
    sab += cj * pi
    sab += ci * pj


k = 0
# Funcția main
nr = numar
if __name__ == "__main__":
    # Citire date de intrare
    n, s, t = map(int, input("Introduceti datele separate prin spatii: ").split())


while True:
     interschimbari = []
     k += 1
     for i in range(t):
     a = sab
        i, j = map(int, input("Introduceti datele separate prin spatii: ").split())
    suma = 0
        interschimbari.append((i, j))
    prod = 1


     while a != 0:
     # Verificare date de intrare
         r = a % 10
    if not verificare_date(n, s, t, interschimbari):
         pc = 1
         print("Datele introduse nu sunt corecte.")
         exit()


        for i in range(1, p - r + 1):
    # Efectuare serii de transformări
             pc *= 10
    for k in range(s):
        for i, j in interschimbari:
            if i > j:
                i, j = j, i
             n = interschimbare_cifre(n, i, j)


        c = (nr // pc) % 10
     # Afișare rezultat
        suma += c * prod
     print("Datele introduse sunt corecte.")
        prod *= 10
     print(n)
        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>
</syntaxhighlight>

Latest revision as of 18:54, 28 April 2023

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>