Rezolvare completă PbInfo #147 expresie1

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 < 10001
  • 0 ≤ x1, x2, …, xn < 1001
  • 0 ≤ V < 2000000001
  • Se poate folosi acelaşi termen din şir pentru A, B şi C.

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 Adresa de email.

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!