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 rezultatula☺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 liniaN+1
se va afișa valoarea0
(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 rezultata☺b
care nu are divizori pari, și pe liniaN+2
se va afișa cel mai mare rezultata☺b
care nu are divizori pari. Dacă un singur rezultat nu are divizori pari, atunci acesta va fi scris și pe liniaN+1
și pe liniaN+2
.
Restricții și precizări
1 ≤ N ≤ 20
a
șib
sunt numere naturale nenule de maxim18
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.
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 Inventie:
#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;
}
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 .
Rezolvarea problemei #1214 Inventie
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1214 Inventie 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!