Rezolvare completă PbInfo #1537 7segmente

Un indicator cu 7 segmente este un dispozitiv de afişaj electronic destinat afişării unei cifre zecimale. Aceste dispozitive sunt utilizate pe scară largă în ceasuri digitale, contoare electronice şi alte aparate, pentru afişarea informaţiilor numerice. Cele 7 segmente au fost notate cu literele a, b, c, d, e, f, g, după modelul din figura de mai jos.

Afişarea uneia din cifrele de la 1 la 9 constă în aprinderea anumitor segmente din cele 7, după cum urmează:
Cifră 1 2 3 4 5 6 7 8 9
Segmente aprinse b,c a,b,d,e,g a,b,c,d,g b,c,f,g a,c,d,f,g a,c,d,e,f,g a,b,c a,b,c,d,e,f,g a,b,c,d,f,g

Proiectarea diverselor sisteme de afişaj trebuie să ţină cont şi de puterea necesară pentru afişarea unei cifre. Pentru aprinderea unui segment este necesară o putere de 1 mW. Astfel, în funcţie de cifra afişată, dispozitivul necesită o putere egală cu numărul de segmente aprinse la afişarea cifrei respective. Puterea necesară pentru afişarea unui număr natural este egală cu suma puterilor necesare afişării fiecăreia dintre cifrele sale.

Cerința

Să se scrie un program care citeşte două numere naturale nenule n şi p, (numărul n având toate cifrele nenule)şi calculează:

  • numărul natural k reprezentând puterea necesară pentru afişarea numărului n;
  • cel mai mare număr natural t, format numai din cifre nenule, mai mic sau egal decât n, care necesită pentru afişare o putere de cel mult p mW.

Date de intrare

Prima linie a fişierului de intrare 7segmente.in conţine două numere naturale nenule n şi p, (numărul n având toate cifrele nenule), despărţite printr-un spaţiu, cu semnificaţia de mai sus.

Date de ieșire

Fişierul de ieşire 7segmente.out va conţine pe o singură linie, cele două numere naturale nenule k şi t (numărul t având toate cifrele nenule), separate printr-un spaţiu, cu semnificaţia de mai sus.

Restricții și precizări

  • 1 ≤ n < 1019;
  • 2 ≤ p ≤ 150;
  • pentru rezolvarea primei cerinţe se va acorda 20% din punctaj, iar pentru rezolvarea celei de-a doua cerinţe se va acorda 80% din punctaj.

Exemplu

7segmente.in

7654 12

7segmente.out

18 7511

Explicație

Numărul n este 7654; puterea necesară pentru afişare este 3 + 6 + 5 + 4 = 18 mW, iar cel mai mare număr, mai mic sau egal cu 7654, format numai din cifre nenule, care necesită pentru afişare o putere de cel mult 12 mW, este 7511.

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

// sursa 100 puncte - Chesca Ciprian

#include <fstream>
#include <math.h>

using namespace std;

typedef unsigned short cifra;

ifstream f("7segmente.in");
ofstream g("7segmente.out");

// v = vector in care obtin cifrele lui n
// t = vector in care formez numarul t
cifra v[20],t[20],p=0;


// vectorul puterilor necesare la afisarea unei cifre (desi este prezenta - nu folosesc cifra 0)
cifra pw[10]={6,2,5,5,4,5,6,3,7,6};

unsigned long long n,cc=1;

int main()
{

cifra pc=0,i=0,nc=0,aux=0,dmin=0,dmax=0,cifra,egalcif=1;

f>>n>>p;

v[0]=0;i=0;
while (n>0)
{
    v[++i]=n%10;
    switch (n%10)
    {
    case 1 : pc=pc+2;break;
    case 2 : pc=pc+5;break;
    case 3 : pc=pc+5;break;
    case 4 : pc=pc+4;break;
    case 5 : pc=pc+5;break;
    case 6 : pc=pc+6;break;
    case 7 : pc=pc+3;break;
    case 8 : pc=pc+7;break;
    case 9 : pc=pc+6;break;
    }
    n=n/10;
}
v[0]=i;
g<<pc<<" ";


// oglindesc cifrele
for(i=1;i<=v[0]/2;i++)
{
    aux=v[i];
    v[i]=v[v[0]+1-i];
    v[v[0]+1-i]=aux;
}


// calculez numarul de cifre(nc) maxim pe care-l poate avea t
nc=p/2;
if (nc>=v[0]) nc=v[0];


// setez toate cifrele la 1
for(i=1;i<=nc;i++)
    t[i]=1;

// din puterea data scad puterea utilizata pentru cifrele de 1
p=p-2*nc;

t[0]=nc;cc=1;egalcif=1;
while (p>0&&cc<=t[0])
{
 dmin=10;cifra=1;dmax=0;
 
 // caut cifra corespunzatoare
 for(i=2;i<=9;i++)
 { 
    if (t[0]==v[0]&&egalcif==1)
         if (i<=v[cc]&&abs(i-v[cc])<=dmin&&p-pw[i]+pw[1]>=0) 
             { cifra=i;dmin=abs(i-v[cc]); }
    if (t[0]<v[0]||egalcif==0)       
         if (i>=dmax&&p-pw[i]+pw[1]>=0) 
             {cifra=i;dmax=i;}           
 }
 // daca am setat o cifra mai mica, restul cifrelor pot fi mai mari
 if (v[cc]-cifra!=0) egalcif=0;
     
 
 // asez cifra pe pozitia corecta si recalculez puterea      
 p+=pw[1];p-=pw[cifra];t[cc++]=cifra;
}

for(i=1;i<=t[0];i++)
    g<<t[i];

g<<"\n";

f.close();
g.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 #1537 7segmente

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