# PBinfo #1537 – 7segmente – Rezolvare C++

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

## Enunț

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.

## Cod sursă C++

```cpp
// 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;
}
```

## Resurse

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