La ora de matematică Georgică a învăţat să evalueze expresii aritmetice. Pentru a verifica acest lucru profesorul de informatică îi propune lui Georgică să evalueze expresii aritmetice de forma:
A o1 B o2 C
Unde A
, B
, C
sunt operanzi, iar o
1
şi o
2
sunt operatori.
Valorile permise operanzilor pot fi numai termeni din şirul x
1
, x
2
, …, x
n
, iar operatorii pot fi numai caracterele +
(adunare) şi *
(înmulţire).
Profesorul îi pune la dispoziție lui Georgică o valoare numerică V
şi îi cere să determine valorile operanzilor A
, B
şi C
pentru care expresia are valoarea V
.
Cerinţă
Scrieţi un program, care pentru V
, n
, x
1
, x
2
, …, x
n
şi o
1
, o
2
date, determină indicii corespunzători termenilor din şirul x
1
, x
2
, …, x
n
ce corespund valorilor operanzilor A
, B
şi C
pentru ca expresia dată să aibă valoarea V
.
Date de intrare
Fişierul de intrare expresie1.in
conţine pe prima linie numerele naturale V
, n
, x
1
, x
2
, …, x
n
separate între ele printr-un spaţiu şi pe linia a doua exact două caractere asociate operatorilor o
1
şi o
2
.
Date de ieşire
Fişierul de ieşire expresie1.out
va conţine, pe prima linie separate între ele exact trei indici ai şirului x
1
, x
2
, …, x
n
corespunzători termenilor folosiţi pentru A
, B
, C
. Dacă nu există soluţie se va scrie în fişier cifra 0
de trei ori separată prin câte un spaţiu: 0 0 0
.
Restricţii şi precizări
0 < n < 10001
0 ≤ x
1
,x
2
, …,x
n
< 1001
0 ≤ V < 2000000001
- Se poate folosi acelaşi termen din şir pentru
A
,B
şiC
.
Exemplu
expresie1.in
100 5 40 13 2 11 20 +*
expresie1.out
5 3 1
Explicaţie
A = x
5
, B = x
3
, C = x
1
Expresia devine 20 + 2 * 40 = 100
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 expresie1:
#include <fstream>
using namespace std;
ifstream fin("expresie1.in");
ofstream fout("expresie1.out");
int f[1005], n, i, j, A, B, C, V, iA,iB,iC;
char o1, o2;
void cit(){
int i,k;
fin>>V>>n;
for(i=1;i<=n;i++){
fin>>k;
f[k]=i;
}
fin.get();
o1=fin.get();
o2=fin.get();
fin.close();
}
int evalexp(int A, int B){
float t;
if(o1=='+')
if(o2=='+')
t=V-(A+B);
else
t=(V-A)/(float)B;
else
if(o2=='+')
t=V-A*B;
else
t=(float)V/(A*B);
if (t>0 && t==int(t))
return (int)t;
return -1;
}
int rezolva(){
int E;
for(iA=0;iA<1001;iA++)
if(f[iA]>0)
for(iB=0;iB<1001;iB++)
if(f[iB]>0)
{
iC=evalexp(iA,iB);
if(iC<1001 && iC>=0 && f[iC]>0){
fout<<f[iA]<<" "<<f[iB]<<" "<<f[iC];
return 1;
}
}
return 0;
}
int main()
{
cit();
if(rezolva()==0)
fout<<"0 0 0";
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 .
Rezolvarea problemei #147 expresie1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #147 expresie1 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!