fork download
  1. #include <iostream>
  2. #include <cmath>
  3. #include <limits>
  4.  
  5. using namespace std;
  6.  
  7. int trimialRoots(double a, double b, double c, double &outX1, double &outX2)
  8. {
  9. static const double epsilon = std::numeric_limits<double>::epsilon();
  10. if (fabs(a) <= (fabs(b) + fabs(c)) * epsilon)
  11. {
  12. if (fabs(b) <= fabs(c) * epsilon)
  13. {
  14. return 0;
  15. }
  16. outX1 = -c / b;
  17. return 1;
  18. }
  19. double delta = b*b - 4*a*c;
  20. if (fabs(delta) <= 2 * (b*b + fabs(4*a*b)) * epsilon)
  21. {
  22. outX1 = - 0.5 * b / a;
  23. return 1;
  24. }
  25. else if (delta < 0)
  26. {
  27. return 0;
  28. }
  29. else
  30. {
  31. double deltaSq = sqrt(delta);
  32. outX1 = - 0.5 * (b - deltaSq) / a;
  33. outX2 = - 0.5 * (b + deltaSq) / a;
  34. return 2;
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. double a, b, c;
  41.  
  42. while (cin >> a >> b >> c)
  43. {
  44. double x1, x2;
  45. cout << "(" << a << ", " << b << ", " << c << "): ";
  46. switch(trimialRoots(a, b, c, x1, x2))
  47. {
  48. case 0:
  49. cout << "No solutions." << endl;
  50. break;
  51. case 1:
  52. cout << "One solution: " << x1 << endl;
  53. break;
  54. case 2:
  55. cout << "Two solutions: x1 = " << x1 << " x2 = " << x2 << endl;
  56. break;
  57. }
  58. }
  59. return 0;
  60. }
  61.  
Success #stdin #stdout 0s 3472KB
stdin
0 1 2
0 0 2
1 0 1
1 0 -1
1 2 -1.25
1 2 1
-1 2 -1
2 4 -2
2 -4 -2
stdout
(0, 1, 2): One solution: -2
(0, 0, 2): No solutions.
(1, 0, 1): No solutions.
(1, 0, -1): Two solutions: x1 = 1 x2 = -1
(1, 2, -1.25): Two solutions: x1 = 0.5 x2 = -2.5
(1, 2, 1): One solution: -1
(-1, 2, -1): One solution: 1
(2, 4, -2): Two solutions: x1 = 0.414214 x2 = -2.41421
(2, -4, -2): Two solutions: x1 = 2.41421 x2 = -0.414214