<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">// Bosquejo de un programa para manipular fracciones
// Autor: Antonio Carrillo Ledesma
// http://mmc.geofisica.unam.mx/acl/


public class Fraccion extends Numero {

   // Numerador de la fraccion
   private long P;
   // Denominador de la fraccion
   private long Q;
   // Arreglo que contendra a los primos
   static private long []Pr;
   // Numero de primos que contendra el arreglo de primos
   static final private int nPr = 1000;



   // Constructor nulo fraccion 0/1
   public Fraccion() {
      this(0, 1);
   }

   // Constructor con un objeto Fraccion
   public Fraccion (Fraccion a) {
      this(a.numerador(), a.denominador());
   }

   // Constructor con entero P Fraccion P/1
   public Fraccion (long p) {
      this(p, 1);
   }

   // Costructor con la fraccion P/Q
   public Fraccion (long p, long q) {
      P = p;
      Q = q;
      calculaPrimos();
   }

   // Genera un nuevo miembro de la clase
   public Numero nuevo() {
      Numero c = new Fraccion();
      return c;
   }


   // Calcula los primeros nPr primos
   private void calculaPrimos() {

      int n, i, np;
      Pr = new long[nPr];

      // Guarda los primeros 2 primos
      Pr[0] = 2;
      Pr[1] = 3;
      np = 2;

      // Empieza la busqueda de primos a partir de 4
      n = 4;

      // Ciclo para buscar los primeros NPB primos
      while (np &lt; nPr) {
         for (i = 0; i &lt; np; i++) {
            if((n % Pr[i]) == 0) break;
         }
         if(i == np) {
            Pr[i] = n;
            np++;
         }
         n++;
      }
   }


   // Visualiza los primos encontrados
   public void visArregloPrimos() {
      System.out.println("Visualiza los primeros " + nPr + " primos");
      for (int i = 0; i &lt; nPr; i++) System.out.println(Pr[i]);
   }


   // Simplifica el numerador y denominador de la fraccion
   private void simplifica() {
      int i, sw;
      for (i = 0; i &lt; nPr; i++) {
         do {
            sw = 0;
            if (Math.abs(P) &lt; 2 || Q &lt; 2) return;
            if((P % Pr[i] == 0) &amp;&amp; (Q % Pr[i] == 0)) {
               P /= Pr[i];
               Q /= Pr[i];
               sw = 1;
            }
         } while(sw == 1);
      }

   }


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

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

   // Regresa verdadero si la fraccion es cero
   public boolean esCero() {
      if (numerador() == 0) return true;
      return false;
   }


   // Suma de fracciones con dos operandos
   public void suma(Numero A, Numero B) {
      Fraccion a = new Fraccion( (Fraccion) A);
      Fraccion b = new Fraccion( (Fraccion) B);

      P = a.numerador() * b.denominador() + b.numerador() * a.denominador();
      Q = a.denominador() * b.denominador();
   }

   // Suma de fracciones con dos operandos
   public void suma(Numero A) {
      Fraccion a = new Fraccion( (Fraccion) A);

      P = numerador() * a.denominador() + a.numerador() * denominador();
      Q = denominador() * a.denominador();
   }


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


   // Ejemplito de uso ...
   public static void main(String[] args) {
      Fraccion a, b, c;
      a = new Fraccion(1, 3);
      b = new Fraccion(2, 3);
      c = new Fraccion();

      a.visualizaLN();
      b.visualizaLN();
      //c.VisArregloPrimos();


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


      int i, n = 10;
      // Inicializacion
      Fraccion d[] = new Fraccion [n];
      for (i = 0; i &lt; n; i++) d[i] = new Fraccion(i, 1);
      // Uso
      for (i = 0; i &lt; n; i++) d[i].visualizaLN();

   }
};



</pre></body></html>