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=2109☺2=7118☺5=3137☺6=1136☺6=126☺10=41643☺1500=1457154323☺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
Nperechi(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
Nrezultate obținute au divizori pari, pe liniaN+1se va afișa valoarea0(zero); - dacă s-a obținut măcar un rezultat fără divizori pari, atunci, pe linia
N+1se va afișa cel mai mic rezultata☺bcare nu are divizori pari, și pe liniaN+2se va afișa cel mai mare rezultata☺bcare 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 ≤ 20așibsunt numere naturale nenule de maxim18cifre 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!