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 ∈ [-10
3
, 10
3
]
,a≠0
- Dacă valorile
a
şib
nu sunt precizate (ex:x^2+x+1=0
), acestea vor fi egale cu1
sau-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; }