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.
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ăruluin
; - cel mai mare număr natural
t
, format numai din cifre nenule, mai mic sau egal decâtn
, care necesită pentru afişare o putere de cel multp
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 < 10
19
;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 acorda80%
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 .
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!