Rezolvare completă PbInfo #2485 nxy

Se consideră N, un număr natural nenul. Dorim să-l scriem pe N ca sumă a două numere naturale nenule x și y, astfel încât suma cifrelor numerelor x și y să fie maximă.

Cerința

Scrieţi un program care să rezolve următoarele cerinţe:

1. să determine suma maximă a cifrelor a două numere x și y cu proprietatea că x+y=N;
2. să determine două numere naturale nenule xmax și ymax cu proprietatea că xmax≥ymax, xmax+ymax=N, suma cifrelor lor este maximă, iar diferența xmax-ymax este maximă;
3. să determine două numere naturale nenule xmin și ymin cu proprietatea că xmin≥ymin, xmin+ymin=N, suma cifrelor lor este maximă, iar diferența xmin-ymin este minimă.

Date de intrare

Fişierul de intrare nxy.in conține pe prima linie numărul natural c, reprezentând cerința (1, 2 sau 3). Pe cea de a doua linie se află numărul natural N.

Date de ieșire

Fişierul de ieșire nxy.out va conține o singură linie. Dacă c=1, pe prima linie va fi scris un număr natural s, reprezentând suma maximă a cifrelor a două numere naturale nenule x și y pentru care x+y=N.
Dacă c=2 sau c=3, pe prima linie vor fi scrise două numere naturale nenule separate printr-un singur spațiu, reprezentând soluţia pentru cerința respectivă (xmax ymax pentru c=2, respectiv xmin ymin pentru c=3).

Restricții și precizări

  • 1 < N ≤ 1018
  • Pentru teste valorând 20% din punctaj cerința este 1. Pentru teste valorând 40% din punctaj cerința
    este 2. Pentru teste valorând 40% punctaj cerința este 3.

Exemplu 1:

nxy.in

1 
25

nxy.out

16 

Explicație

Suma maximă care se poate obţine adunând cifrele a două numere x și y pentru care x+y=25 este 16.

Exemplu 2:

nxy.in

2 
25

nxy.out

19 6

Explicație

Suma maximă care se poate obține adunând cifrele a două numere x și y pentru care x+y=25 este 16. Perechea de numere xmax≥ymax pentru care xmax-ymax este maximă (13) și pentru care suma cifrelor este maximă este xmax=19 și ymax=6.

Exemplu 3:

nxy.in

3
25

nxy.out

16 9

Explicație

p.Suma maximă care se poate obține adunând cifrele a două numere x și y pentru care x+y=25 este 16. Perechea de numere xmin≥ymin pentru care xmin-ymin este minimă (7) și pentru care suma cifrelor este maximă este xmin=16 și ymin=9.

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 nxy:

#include <fstream>

using namespace std;
ifstream fin("nxy.in");
ofstream fout("nxy.out");
long long int n, rezx, rezy, rezxx, rezyy;
int c[20];
int x[20];
int y[20];
int xx[20];
int yy[20];

int sum, lg, lgx, lgy, lgxx, lgyy, sum2;
int cerinta;

int main()
{int i, t, tt, val, unde;
 fin>>cerinta;
 fin>>n;
 while (n)
         {
          c[lg++]=n%10;
          n/=10;
         }
//xmax ymax

 for (t=i=0; i<lg-1; i++)
        {
         x[i]=9;
         y[i]=c[i]-t-x[i];
         if (y[i]<0) {y[i]+=10; t=1;}
            else t=0;
        }
 x[i]=c[i]-t;
 lgx=lg; lgy=lg-1;
 if (x[i]==0) lgx=lg-1;
 for (i=lgx-1; i>=0; i--) {sum+=x[i]; rezx=rezx*10+x[i];}
 for (i=lgy-1; i>=0; i--) {sum+=y[i]; rezy=rezy*10+y[i];}

//xmin ymin
unde=lg-1;
while (1)
{
 for (tt=i=0; i<unde; i++)
        {
         yy[i]=9;
         xx[i]=c[i]-9-tt;
         if (xx[i]<0) {tt=1; xx[i]=xx[i]+10;}
            else tt=0;
        }
 val=0; i=lg-1;
 while (i>=unde) {val=val*10+c[i];i--;}
 val-=tt;
 if (val>0)
     {
     yy[unde]=val/2;
     xx[unde]=val-yy[unde];
     rezxx=xx[unde]; rezyy=yy[unde];
     for (i=unde-1; i>=0; i--) rezxx=rezxx*10+xx[i];
     for (i=unde-1; i>=0; i--)  rezyy=rezyy*10+yy[i];
     if (rezxx>=rezyy) break;
        else unde--;
     }
    else unde--;
}
if (cerinta==1)
   fout<<sum<<'\n';
   else
   if (cerinta==2)
      {
       if (rezy==0) {rezx--; rezy=1;}
       fout<<rezx<<' '<<rezy<<'\n';
      }
     else
     fout<<rezxx<<' '<<rezyy<<'\n';

  fout.close();
  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 #2485 nxy

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2485 nxy 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!