313
Cerința
Dându-se o ecuaţie de gradul 2, să se scrie un program care determină soluţiile acestei ecuaţii.
Date de intrare
Fișierul de intrare ecuatii.in conține pe prima linie un şir de caractere de forma ax^2+bx+c, reprezentând o ecuaţie de gradul 2: ax2+bx+c=0
Date de ieșire
Fișierul de ieșire ecuatii.out va conține soluţiile acestei ecuaţii, cu 2 zecimale exacte, sperate printr-un spaţiu. Dacă ecuaţia nu are soluţii reale, se va afişa -1. Dacă ecuaţia are o singură soluţie reală, se va afişa numai aceasta, cu 2 zecimale exacte.
Restricții și precizări
a, b, c ∈ [-103, 103],a≠0- Dacă valorile
aşibnu sunt precizate (ex:x^2+x+1=0), acestea vor fi egale cu1sau-1, în funcţie de semn (vedeţi exemplele) - Dacă ecuaţia are 2 soluţii reale, se va afişa cea mai mică, urmată de cea mai mare
Exemple:
|
|
#include <bits/stdc++.h>
using namespace std;
ifstream cin("ecuatii.in");
ofstream cout("ecuatii.out");
int main()
{
char ch;
cin >> ch;
int a = 0;
bool negativ=false;
int cnt=0;
while(ch != 'x')
{
if(ch == '-')
negativ=true;
else
a=a*10+(int)ch - 48 , cnt++;
cin >> ch;
}
if(cnt==0)
a=1;
if(negativ)
a*=-1;
negativ=false;
while(ch !='-' && ch !='+')
cin >> ch;
int b = 0;
if(ch == '+')
{
cin >> ch;
bool ok=true;
if(ch=='x')
ok=false;
while(ch != 'x')
{
b = b * 10 + (int)ch - 48;
cin >> ch;
}
if(!ok)
b=1;
}
else
{
cin >> ch;
bool ok=true;
if(ch=='x')
ok=false;
while(ch != 'x')
{
b = b * 10 + (int)ch - 48;
cin >> ch;
}
if(!ok)
b=1;
b*=-1;
}
int c;
cin >> ch;
if(ch=='+')
cin >> c;
else
cin >> c , c *= -1;
float delta = b * b - 4 * a * c;
if(delta < 0)
cout << -1;
else if(delta == 0)
{
float rez = - b / (2 * a);
cout << fixed << setprecision(2) << rez;
}
else
{
float delta1 = sqrt(delta);
float rez1 = (-b + delta1) / (2 * a);
float rez2 = (-b - delta1) / (2 * a);
if(rez1 > rez2)
swap(rez1 , rez2);
cout << fixed << setprecision(2) << rez1 << ' ' << rez2;
}
return 0;
}
Comentarii