Rezolvare completă PbInfo #1059 SchimbCifre

Cerința

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

Date de intrare

Programul citește de la tastatură numerele n, t și m, iar apoi m 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 t serii de transformări.

Restricții și precizări

  • 1 ≤ n < 1.000.000.000
  • 1 ≤ t ≤ 2.000.000.000
  • 1 ≤ m ≤ 10
  • prima cifră din scrierea lui n se află pe poziția 1
  • numerele din cele m 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

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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema SchimbCifre:

#include <iostream>

// solutie fara vectori

using namespace std;
int n , t , m , k , sab , p , nr , j , u , l , pi , pj , ci , cj , suma , prod , c , pc , r , i , a ;

int main()
{
    cin >> n >> t >> m ;

    // aflu cate cifre are n si formez  un numar sablon sab=1234...p
    k = n ;
    p = 0 ;
    sab = 0 ;
    while(k != 0)
    {
        k = k / 10 ;
        p++ ;
        sab = sab * 10 + p ;
    }
    // aplic transformarile pe sablon
    for(k = 1 ; k <= m ; k++)
    {
        cin >> i >> j ;
        if(i > j) { u = i ; i = j ; j = u ; }
        // interschimb cifrele de pe pozitiile i si j din sablon
        pi = 1;
        pj = 1;
        for(l = 1 ; l <= p - i ; l++) pi = pi * 10 ;
        for(l = 1 ; l <= p - j ; l++) pj = pj * 10 ;
        ci = ( sab / pi ) % 10 ;
        cj = ( sab / pj ) % 10 ;
        sab = sab - ci * pi ;
        sab = sab - cj * pj ;
        sab = sab + cj * pi ;
        sab = sab + ci * pj ;
    }
    // aflu cate serii de transformari sunt necesare pentru ca numarul n sa devina cat era initial
    k = 0 ;
    nr = n ;
    do
    {
        k++ ;
        // aplic transformarile asupra lui nr folosind sablonul
        a = sab ;
        suma = 0 ;
        prod = 1 ;
        while ( a != 0 )
        {
            r= a % 10 ;
            pc = 1 ;
            for( i = 1 ; i <= p - r ; i++ ) pc = pc * 10 ;
            c = ( nr / pc ) % 10 ;
            suma = suma + c * prod ;
            prod = prod * 10 ;
            a = a / 10 ;
        }
        nr = suma ;
    }while( nr != n);
    // deci dupa k serii de transformari numarul devine egal cu cel initial
    t = t % k ;
    // aplic t serii de transformari lui n
    nr = n ;
    for ( i = 1 ; i <= t ; i++ )
    {
        // aplic transformarile asupra lui nr folosind sablonul
        a = sab ;
        suma = 0 ;
        prod = 1 ;
        while ( a != 0 )
        {
            r= a % 10 ;
            pc = 1 ;
            for( j = 1 ; j <= p - r ; j++ ) pc = pc * 10 ;
            c = ( nr / pc ) % 10 ;
            suma = suma + c * prod ;
            prod = prod * 10 ;
            a = a / 10 ;
        }
        nr = suma ;
    }
    cout << nr ;

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1059 SchimbCifre

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1059 SchimbCifre de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!