// 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 < nPr) { for (i = 0; i < 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 < 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 < nPr; i++) { do { sw = 0; if (Math.abs(P) < 2 || Q < 2) return; if((P % Pr[i] == 0) && (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 < n; i++) d[i] = new Fraccion(i, 1); // Uso for (i = 0; i < n; i++) d[i].visualizaLN(); } };