Zadanie znak działania

0

Cześć!
Mam pytanie i również prośbę o pomoc.
Najpierw próbowałem zrobić sam to zadanie a później z resztą tej strony podłapałem jak to mniej więcej trzeba zrobić i doszedłem do czegoś takiego:

#include <iostream>
using namespace std;
int main()
{

    int a, b, w1, w2, w3, w4, w5, w6;
    cin >> a >> b;
    w1 = a + b;
    w2 = a - b;
    w3 = a * b;

    if ((w1 == w2) || (w1 == w3) || (w2 == w3)) {
        cout << "NIE";
    }

    else if (w1 > w2) {
        if (w1 > w3) {
            if (b < 0)
                cout << a << "+"
                     << "(" << b << ")"
                     << "=" << w1;
            else
                cout << a << "+" << b << "=" << w1;
        }
        else {
            if (b < 0)
                cout << a << "*"
                     << "(" << b << ")"
                     << "=" << w3;
            else
                cout << a << "*" << b << "=" << w3;
        }
    }
    else {
        if (w2 > w3) {
            if (b < 0)
                cout << a << "-"
                     << "(" << b << ")"
                     << "=" << w2;
            else
                cout << a << "-" << b << "=" << w2;
        }
        else {
            if (b < 0)
                cout << a << "*"
                     << "(" << b << ")"
                     << "=" << w3;
            else
                cout << a << "*" << b << "=" << w3;
        }
    }
    return 0;
}

Generalnie wyniki wychodzą dobre także tak naprawdę zadanie prawie skończone tylko że liczby na minusie mają być w nawiasach a gdy próbuje to ustawić dla w1,w2,w3 i a to wszystko się sypie :(.
Tutaj jest polecenie:
Napisz program, który wczyta dwie liczby całkowite i , a następnie wstawi znak działania '+', '-' albo '*' między nimi, w taki sposób, aby wynik działania był jak największy. Jeżeli można uzyskać największy wynik za pomocą więcej niż jednego działania, wypisujemy słowo 'NIE'.
Prosiłbym o napisanie ja kto można zrobić i ewentualne wytłumaczenie.

1

Ok, to po kolei, wpierw zobaczmy jak się będzie to zachowywać w różnych przypadkach:

  1. Jeśli liczby a i b mają różny znak, to najwyższy wynik uzyskamy przy pomocy -. Dowód:
  • zakładamy, że a > 0 i b < 0 (mają różny znak)
  • wtedy a + b = a - |b| < a, ab = -a|b| < 0 < a oraz a - b = a + |b| > a
  • z tego wynika, że ab < a + b < a - b QED
  1. Jeśli a i b są ujemne to najwyższy wynik uzyskamy przy pomocy *. Dowód:
  • zakładamy, że a < 0 i b < 0 oraz a > b
  • wtedy a + b = -(|a| + |b|) < 0, a - b = -(|a| - |b|) < b - a = |a| - |b| < |a|, oraz ab = |a||b| >= |a|
  • z tego wynika, że a + b < a - b < b - a < ab QED
  1. Jeśli a i b są większe od 2 to najwyższy wynik uzyskamy przy pomocy *. Dowód:
  • zakładamy, że a > 2 oraz b > 2 oraz a > b
  • a - b > b - a oraz a - b < a + b
  • a + b < 2a oraz ab > 2a gdyż b > 2 QED
  1. Jeśli a = b = 2 to odpowiedź brzmi NIE. Dowód:
  • ab = a + b = 4 QED
  1. Jeśli a = 1 oraz b > 0 to odpowiedź brzmi +. Dowód:
  • a + b = b + 1 > ab = b QED
  1. Jeśli a = 0 lub b = 0 to odpowiedź brzmi NIE. Dowód:
  • a + b = a - b QED

Problem z Twoim programem jest taki, że sprawdza tylko a - b a nie sprawdza b - a. Treść zadania nie mówi jaka ma być kolejność liczb w obliczeniach. Ale jak widać powyżej nie trzeba w ogóle liczyć wyników by poznać odpowiedź.

0

Dziękuję bardzo :), teraz wszystko działa.

2

Używając C++17 można stworzyć implementację nie zawierającą żadnego ifa.

#include <iostream>
#include <set>
#include <map>

using namespace std;

int main()
{
    int a { 123 };
    int b { -84 };

    set<int,greater<int>> results { a*b , a+b , a-b , b-a };
    map<int,tuple<int,int,char>> operations { {a*b,make_tuple(a,b,'*')} , {a+b,make_tuple(a,b,'+')} ,
                                              {a-b,make_tuple(a,b,'-')} , {b-a,make_tuple(b,a,'-')} };

    const auto& [ a1 , b1 , sign ] = operations[*results.begin()];
    results.size() < 3 ? cout << "NIE" : cout << "(" << a1 <<  ")" << sign << "(" << b1 << ") = " << *results.begin();

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1