public class Fraccion {

   // Numerador de la fraccion
   private long P;
   // Denominador de la fraccion
   private long Q;


   // Constructor nulo fraccion 0/1
   public Fraccion() {
      P = 0;
      Q = 1;
   }

   // Constructor con un objeto Fraccion
   public Fraccion (Fraccion a) {
      P = a.numerador();
      Q = a.denominador();
   }

   // Constructo con numerador P y denominador Q
   public Fraccion (long p, long q) {
      P = p;
      Q = Math.abs(q);
   }

   // Constructor con entero P Fraccion P/1
   public Fraccion (long p) {
      P = p;
      Q = 1;
   }


   // Simplifica el numerador y denominador de la fraccion
   private void simplifica(CalculaPrimos prim) {

      int i, sw;
      long pr;

      // Simplifica a la fraccion cero
      if(P == 0) Q = 1;

      for (i = 0; i < prim.numeroPrimos(); i++) {
         pr = prim.primo(i);
         if (pr > Math.abs(P) && pr > Q) break;
         do {
            sw = 0;
            if (Math.abs(P) < 2 || Q < 2) break;
            if((P % pr == 0) && (Q % pr == 0)) {
               P /= pr;
               Q /= pr;
               sw = 1;
            }
         } while(sw == 1);
      }

   }



   // Retorna el Numerador
   public long numerador() {
      return P;
   }

   // Retorna el denominador
   public long denominador() {
      return Q;
   }

   // Suma de fracciones con un operando
   public void suma(Fraccion a) {
      P = numerador() * a.denominador() + a.numerador() * denominador();
      Q = denominador() * a.denominador();
   }

   // Suma de fracciones con dos operandos
   public void suma(Fraccion a, Fraccion b) {
      P = a.numerador() * b.denominador() + b.numerador() * a.denominador();
      Q = a.denominador() * b.denominador();
   }


   // Visualiza la Fraccion
   public void visualiza() {
      System.out.print(P);
      System.out.print("/");
      System.out.print(Q);
   }

   // Visualiza la fraccion y cambia de linea
   public void visualizaLN() {
      visualiza();
      System.out.println(" ");
   }


   // Ejemplito de uso ...
   public static void main(String[] args) {

      CalculaPrimos prim = new CalculaPrimos(10);
      prim.visualiza();

      Fraccion a, b, c;
      a = new Fraccion(2, 3);
      b = new Fraccion(2, 6);
      c = new Fraccion();

      b.visualizaLN();
      b.simplifica(prim);
      b.visualizaLN();


      System.out.println("Suma");
      a.visualiza();
      System.out.print(" + ");
      b.visualiza();
      System.out.print(" = ");
      c.suma(a, b);
      c.simplifica(prim);
      c.visualizaLN();


      System.out.println("Suma");
      a.visualiza();
      System.out.print(" + ");
      b.visualiza();
      System.out.print(" = ");
      a.suma(b);
      a.simplifica(prim);
      a.visualizaLN();


   }
};