import java.util.Scanner;
import java.util.Locale;

class PGQuadratik {

/**
  Résout l'équation linéaire a*x+b=0 dans R
  @param[in] a - coefficient de x
  @param[in] b - coefficient constant
  @param[out] n - nombre de solutions
  @param[out] x - solution
*/

public static void resoudreDegre1(double a, double b, int[] n, double[] x)
{
  if (a != 0.0)
  {
    n[0] = 1;
    x[0] = -b / a;
  }
  else if (b != 0.0)
  {
    n[0] = 0;
  }
  else
  {
    n[0] = -1;
  }
}

/**
  Résout l'equation quadratique a*x^2+b*x+c=0 dans R (a non nul)
  @param[in] a - coefficient de x^2
  @param[in] b - coefficient de x
  @param[in] c - coefficient constant
  @param[out] n - nombre de solutions
  @param[out] x1 - première solution
  @param[out] x2 - deuxième solution
*/

public static void resoudreDegre2(double a, double b, double c, int[] n, double[] x1, double[] x2)
{
  double delta = b * b - 4 * a * c;
  if (delta > 0.0)
  {
    n[0] = 2;
    x1[0] = (-b + Math.Math.sqrt(delta)) / (2 * a);
    x2[0] = (-b - Math.sqrt(delta)) / (2 * a);
  }
  else if (delta < 0.0)
  {
    n[0] = 0;
  }
  else
  {
    n[0] = 1;
    x1[0] = (-b) / (2 * a);
  }
}

/**
  Résout l'équation quadratique a*x^2+b*x+c=0 dans R
  @param[in] a - coefficient de x^2
  @param[in] b - coefficient de x
  @param[in] c - coefficient constant
  @param[out] n - nombre de solutions
  @param[out] x1 - première solution
  @param[out] x2 - deuxième solution
*/

public static void resoudre(double a, double b, double c, int[] n, double[] x1, double[] x2)
{
  if (a != 0.0)
  {
    resoudreDegre2(a,b,c,n,x1,x2);
  }
  else
  {
    resoudreDegre1(b,c,n,x1);
  }
}

/**
  Affiche les solutions de l'équation quadratique dans R
  @param[in] n - nombre de solutions
  @param[in] x1 - première solution
  @param[in] x2 - deuxième solution
*/

public static void afficherSolutions(int n, double x1, double x2)
{
  switch (n)
  {
    case 2:
      System.out.println("==> Deux racines: " + x1 + " et " + x2);
      break;
    case 1:
      System.out.println("==> Une racine: " + x1);
      break;
    case 0:
      System.out.println("==> Aucune solution dans R");
      break;
    case -1:
      System.out.println("==> L'ensemble R");
      break;
  }
}

/**
  @test
*/

public static void test_quadratik1()
{
  Scanner input = new Scanner(System.in);
  input.useLocale(Locale.US);
  double a, b, c;
  System.out.print("Coefficients a b c de l'equation? ");
  a = input.nextDouble();
  b = input.nextDouble();
  c = input.nextDouble();
  int[] ns = new int[1];
  double[] x1 = new double[1], x2 = new double[1];
  resoudre(a,b,c,ns,x1,x2);
  afficherSolutions(ns[0],x1[0],x2[0]);
}

/**
  Résout l'équation quadratique a*x^2+b*x+c=0 dans C
  @param[in] a - coefficient de x^2
  @param[in] b - coefficient de x
  @param[in] c - coefficient constant
  @param[out] n - nombre de solutions
  @param[out] x1 - partie réelle
  @param[out] x2 - partie imaginaire
*/

public static void resoudreDegre2C(double a, double b, double c, int[] n, double[] x1, double[] x2)
{
  resoudreDegre2(a,b,c,n,x1,x2);
  if (n[0] == 0)
  {
    double delta = b * b - 4 * a * c;
    n[0] = -2;
    x1[0] = (-b) / (2 * a);
    x2[0] = Math.Math.sqrt(-delta) / (2 * a);
  }
}

/**
  Résout l'équation quadratique a*x^2+b*x+c=0 dans C
  @param[in] a - coefficient de x^2
  @param[in] b - coefficient de x
  @param[in] c - coefficient constant
  @param[out] n - nombre de solutions
  @param[out] x1 - première solution ou partie réelle
  @param[out] x2 - deuxième solution ou partie imaginaire
*/

public static void resoudreC(double a, double b, double c, int[] n, double[] x1, double[] x2)
{
  if (a != 0.0)
  {
    resoudreDegre2C(a,b,c,n,x1,x2);
  }
  else
  {
    resoudreDegre1(b,c,n,x1);
  }
}

/**
  Affiche les solutions de l'équation quadratique dans C
  @param[in] n - nombre de solutions
  @param[in] x1 - première solution ou partie réelle
  @param[in] x2 - deuxième solution ou partie imaginaire
*/

public static void afficherSolutionsC(int n, double x1, double x2)
{
  if (n == -2)
  {
    System.out.println("==> Deux racines sur C: " + x1 + "-" + x2 + "i et " + x1 + "+" + x2 + "i");
  }
  else
  {
    afficherSolutions(n,x1,x2);
  }
}

/**
  @test
*/

public static void test_quadratik2()
{
  Scanner input = new Scanner(System.in);
  input.useLocale(Locale.US);
  double a, b, c;
  System.out.print("Coefficients a b c de l'equation? ");
  a = input.nextDouble();
  b = input.nextDouble();
  c = input.nextDouble();
  int[] ns = new int[1];
  double[] x1 = new double[1], x2 = new double[1];
  resoudreC(a,b,c,ns,x1,x2);
  afficherSolutionsC(ns[0],x1[0],x2[0]);
}

public static void main(String[] args)
{
  test_quadratik1();
  test_quadratik2();
}

}
