# PBinfo #1214 – Inventie – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Lui Mihai îi place matematica distractivă, sau poate mai mult distracția decât matematica. Pentru a scăpa de teme, el a inventat operația ”smile” notată cu semnul ☺, operație care se aplică numerelor naturale nenule conform exemplelor de mai jos:


6☺4=210
9☺2=711
8☺5=313
7☺6=113
6☺6=12
6☺10=416
43☺1500=14571543
23☺23=46

Profesorul de matematică i-a promis nota 10 pentru invenție, numai dacă știe să determine corect numărul divizorilor pari pentru rezultatul obținut prin operația ”smile”. Astfel, Mihai a primit N perechi de numere (a,b)  pentru care trebuie să calculeze a☺b și să determine dacă rezultatul obținut are divizori pari.

Cerinţe
Scrieți un program care citește un număr natural N și N perechi de numere naturale (a,b) și afișează:

a) pentru fiecare pereche de numere (a,b), rezultatul a☺b;
b) cel mai mic și cel mai mare rezultat a☺b care nu are divizori pari.

Date de intrare
Fişierul de intrare inventie.in conţine pe prima linie un număr natural N. Fiecare din următoarele N linii conține câte două numere naturale a b despărțite printr-un spațiu.

Date de ieșire
În fişierul de ieşire inventie.out:


pentru fiecare din cele N perechi (a,b), se va afișa rezultatul a☺b, fiecare rezultat pe câte o linie, în ordinea în care perechile apar în fișierul de intrare;
dacă toate cele N rezultate obținute au divizori pari, pe linia N+1 se va afișa valoarea 0 (zero);
dacă s-a obținut măcar un rezultat fără divizori pari, atunci, pe linia N+1 se va afișa cel mai mic rezultat a☺b care nu are divizori pari, și pe linia N+2 se va afișa cel mai mare rezultat a☺b care nu are divizori pari. Dacă un singur rezultat nu are divizori pari, atunci acesta va fi scris și pe linia N+1 și pe linia N+2.

Restricții și precizări

1 ≤ N ≤ 20
a și b sunt numere naturale nenule de maxim 18 cifre fiecare

Exemplul 1
inventie.in

8
6 4
9 2
8 5
7 6
6 6
6 10
43 1500
23 23
inventie.out

210
711
313
113
12
416
14571543
46
113
14571543
Explicație
Prin operația ”smile” se obțin, în ordine, valorile 210, 711, 313, 113, 12, 416, 14571543, 46. 

Dintre acestea nu au divizori pari numerele 711, 313, 113, 14571543, cel mai mic fiind 113 și cel mai mare 14571543.

Exemplul 2
inventie.in

2
13 13
268 1244
inventie.out

26
9761512
0
Explicație
Prin operația ”smile” se obțin, în ordine, valorile 26, 9761512, ambele numere având divizori pari.

## Cod sursă C++

```cpp
#include<fstream>
#include<algorithm>
using namespace std;
int main()
{
    int gasit=0,n,v[60],vmin[60],vmax[60],maimic,maimare,i,k;
    unsigned long long s,dif,a,b;
    ifstream f("inventie.in");
    ofstream g("inventie.out");
    f>>n;
    for (i=1; i<=n; i++)
    {
        f>>a>>b;
        if (a==b) g<<a+b<<'\n';
        else
        {
            if (a>b) dif=a-b;
            else dif=b-a;
            g<<dif<<a+b<<'\n';
        }
        if (a%2!=b%2)
        {
            k=0; // numarul cifrelor
            gasit=1;
            s=a+b;
            while (s)
            {
                k++;
                vmin[k]=vmax[k]=s%10;
                s=s/10;
            }
            while (dif)
            {
                k++;
                vmin[k]=vmax[k]=dif%10;
                dif=dif/10;
            }
            vmin[0]=vmax[0]=k;
            break;
        }
    }
    i++;
    while (i<=n)
    {
        f>>a>>b; //g<<" am citit "<<a<<' '<<b<<"la pasul "<<i<<'\n';
        if (a==b) g<<a+b<<'\n';
        else
        {
            if (a>b) dif=a-b;
            else dif=b-a;
            g<<dif<<a+b<<'\n';
        }
        if (a%2!=b%2)
        {
            k=0; // numarul cifrelor
            s=a+b;
            while (s)
            {
                k++;
                v[k]=s%10;
                s=s/10;
            }
            while (dif)
            {
                k++;
                v[k]=dif%10;
                dif=dif/10;
            }
            v[0]=k;
            // verific daca noul rezultat este mai mic decat vmin, sau mai mare decat vmax
            if (v[0]<vmin[0])
                for (int j=0; j<=v[0]; j++) vmin[j]=v[j];
            else if (v[0]>vmax[0])
                for (int j=0; j<=v[0]; j++) vmax[j]=v[j];
            else
            {
                if (v[0]==vmin[0])
                {
                    maimic=1;// pres ca v<vmin
                    for (int j=v[0]; j>=1; j--)
                        if (v[j]>vmin[j])
                        {
                            maimic=0;
                            break;
                        }
                        else    if (v[j]<vmin[j]) break;
                    if (maimic){
                        for (int j=0; j<=v[0]; j++) vmin[j]=v[j];
                       }
                }
                if (v[0]==vmax[0])
                {
                    maimare=1; // pres ca v>vmax
                    for (int j=v[0]; j>=1; j--)
                        if (v[j]<vmax[j])
                        {
                            maimare=0;
                            break;
                        }
                        else if  (v[j]>vmax[j]) break;
                    if (maimare)
                        for (int j=0; j<=v[0]; j++) vmax[j]=v[j];
                }
            }
        }
        i++;
    }
    if (gasit==0) g<<0<<'\n';
    else
    {
        for (int j=vmin[0]; j>=1; j--) g<<vmin[j];
        g<<'\n';
        for (int j=vmax[0]; j>=1; j--) g<<vmax[j];
        g<<'\n';
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1214)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1214/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1214/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
