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 o1 şi o2 sunt operatori.
Valorile permise operanzilor pot fi numai termeni din şirul x1, x2, …, xn, 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, x1, x2, …, xn şi o1, o2 date, determină indicii corespunzători termenilor din şirul x1, x2, …, xn 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, x1, x2, …, xn separate între ele printr-un spaţiu şi pe linia a doua exact două caractere asociate operatorilor o1 şi o2.
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 x1, x2, …, xn 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 < 100010 ≤ x1,x2, …,xn< 10010 ≤ 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 = x5, B = x3, C = x1
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!