311
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șarealș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șarealeș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șaimaginareși apoi, pe următorul rând, se vor afișa'A B', undeA=−b2a șiB=△√2a , cu semnificația că soluțiile ecuației suntA±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,c∈Z⋂[−10.000,+10.000] șia nenul;^reprezintă ridicarea la putere, adicăx^2este echivalent cux2 X∈ ['a', 'z'];- Se acceptă o eroare de maximum
10−2 .
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