fbpx

Problema #2667 – ec2i – Rezolvari PBInfo

de Mihai-Alexandru

Ecuație de gradul II

Fie aX^2+bX+c=0 o ecuație de gradul al doilea. Determinați soluțiile complexe ale acestei ecuații.

Date de intrare

Programul citește de la tastatură o expresie de gradul al doilea sub forma unui șir de caractere ce poate conține o singură literă mică (notată mai jos, general, cu X), cifre și simbolurile +, -, ^, reprezentând membrul stâng al ecuației. Pentru clarificare, vezi exemplele de mai jos.

Date de ieșire

  • Dacă ∆=0, se va afișa real și apoi, pe următorul rând, un număr rațional ce reprezintă singura soluție posibilă a ecuației;
  • Dacă ∆>0, se va afișa reale și apoi, pe următorul rând, se vor afișa două numere raționale ce reprezintă soluțiile ecuației în ordine crescătoare;
  • Dacă ∆<0, se va afișa imaginare și apoi, pe următorul rând, se vor afișa 'A B', unde A=b2a și B=2a, cu semnificația că soluțiile ecuației sunt A±B.

Restricții și precizări

  • Expresia dată, cu termenii reașezați descrescător după putere, este de forma aX^2+bX+c.
  • a,b,cZ[10.000,+10.000] și a nenul;
  • ^ reprezintă ridicarea la putere, adică x^2 este echivalent cu x2
  • X ['a', 'z'];
  • Se acceptă o eroare de maximum 102.

Exemple:

Exemplul 1:

Intrare

-5x+2x^2+3

Ieșire

reale
1 1.5

Explicație

∆ = 1 (>0)

Exemplul 2:

Intrare

1v^2+9-6v

Ieșire

real
3

Explicație

∆ = 0

Exemplul 3:

Intrare

3a^2+4a+2

Ieșire

imaginare
-0.66 0.47i

Explicație

∆ = -8 (<0)

#include <bits/stdc++.h>


using namespace std;

char s[101];
char m[101][101];
char v[101] , p = 0;

bool putere(char a[])
{
    int i = 0;
    while(a[i])
    {
        if(a[i] == '^')
            return true;
        i++;
    }
    return false;
}

bool c(char ch)
{
    return ch >= 'a' && ch <= 'x';
}

bool lit(char ch)
{
    return ch >= '0' && ch <= '9';
}

bool cif(char a[])
{
    int i = 0;
    while(a[i])
    {
        if(c(a[i]))
            return false;
        i++;
    }
    return true;
}

int main()
{
    cin >> s;
    int i = 0;
    int cnt = 0 , j = 0;
    if(!(s[0] == '-' || s[0] == '+'))
        v[p] = '+' , p++;
    while(s[i])
    {
        if((s[i] == '-' || s[i] == '+'))
        {
            v[p] = s[i];
            p++;
            if(i > 0)
                cnt++;
            j = 0;
        }
        else
            m[cnt][j] = s[i] , j++;
        i++;
    }
    int ia , ib , ic;
    for(int i = 0 ; i <= cnt ; ++i)
    {
        if(putere(m[i]))
            ia = i;
        else if(cif(m[i]))
            ic = i;
        else
            ib = i;
    }
    int a = 0 , b = 0 , cc = 0;
    i = 0;
    while(lit(m[ia][i]))
    {
        a = a * 10 + m[ia][i] - '0';
        i++;
    }
    i = 0;
    while(lit(m[ib][i]))
    {
        b = b * 10 + m[ib][i] - '0';
        i++;
    }
    i = 0;
    while(lit(m[ic][i]))
    {
        cc = cc * 10 + m[ic][i] - '0';
        i++;
    }
    if(v[ia] == '-')
        a = a * (-1);
    if(v[ib] == '-')
        b = b * (-1);
    if(v[ic] == '-')
        cc = cc * (-1);
    int delta = b * b - 4 * a * cc;
    if(delta < 0)
        cout << "imaginare" << endl;
    else if(delta == 0)
        cout << "real" << endl;
    else
        cout << "reale" << endl;
    if(delta == 0)
    {
        cout << ((-1) * b) / (2 * a);
    }
    if(delta > 0)
    {
        double x1 = ((-1) * b + sqrt(delta)) / (2 * a);
        double x2 = ((-1) * b - sqrt(delta)) / (2 * a);
        cout <<min( x1 , x2 ) << ' ' << max (x2 , x1);
    }
    if(delta < 0)
    {
        delta = delta*(-1);
        double md = sqrt(delta) / (2 * a) , ms = (double)((-1) * b) / (2 * a);
        cout << ms << ' ' << md << 'i';
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa