Servus...
hier eine mögliche Lösung...
Also ich bekomme einen BufferOverFlowError bei der Rekursion ohne Modulo, ich denke es liegt an den zu großen Zahlen in der Input-Datei.
Alles anzeigen
hier eine mögliche Lösung...
Also ich bekomme einen BufferOverFlowError bei der Rekursion ohne Modulo, ich denke es liegt an den zu großen Zahlen in der Input-Datei.
Quellcode
- package u1;
- import fhw.*;
- public class A5 {
- // Standard-Modus: false
- // Sicherer-Modus: true (andere Ergebnise)
- static boolean BufferOverFlowSave = true;
- // Maximale Zahl
- static int BufferBorder = 20000;
- public static void main (String args[]) {
- int zahlen[] = ADSTool.readIntArray("u1a4.dat") ;
- int teiler;
- int nenner;
- int summe;
- int anz;
- String methode = "";
- for(int j = 1; j <= 4; j++) {
- summe = 0;
- anz = 0;
- ADSTool.resetTime();
- for(int i = 0; i < zahlen.length; i++) {
- if(i%2 == 0 && i < zahlen.length - 1) {
- if(BufferOverFlowSave) {
- teiler = zahlen[i] > BufferBorder ? BufferBorder : zahlen[i];
- nenner = zahlen[i+1] > BufferBorder ? BufferBorder : zahlen[i+1];
- }
- else {
- teiler = zahlen[i];
- nenner = zahlen[i+1];
- }
- switch(j) {
- case 1:
- summe += ggT_iterativ (teiler, nenner);
- anz++;
- break;
- case 2:
- if(BufferOverFlowSave) {
- summe += ggT_rekursiv (teiler, nenner);
- anz++;
- }
- break;
- case 3:
- summe += ggT_iterativ_modulo (teiler, nenner);
- anz++;
- break;
- case 4:
- summe += ggT_rekursiv_modulo (teiler, nenner);
- anz++;
- break;
- }
- }
- }
- switch (j) {
- case 1: methode = "ggT (iterativ)"; break;
- case 2: methode = "ggT (rekursiv)"; break;
- case 3: methode = "ggT (iterativ mit Modulo)"; break;
- case 4: methode = "ggT (rekursiv mit Modulo)"; break;
- }
- if(BufferOverFlowSave || (!BufferOverFlowSave && j != 2)) {
- System.out.print("==============================\n");
- System.out.printf("Verwendeter Algorithmus: %s\n", methode);
- System.out.printf("Ergebnis: %d\n",summe/anz);
- System.out.printf("Zeitmessung: %s\n\n",ADSTool.stringRTime());
- }
- }
- }
- /**
- * ggT - iterativ
- * @param x > 0
- * @param y > 0
- * @return ggT
- */
- public static int ggT_iterativ (int x, int y) {
- while(x != y) {
- if(x < y) {
- int t = x;
- x = y;
- y = t;
- }
- x = x - y;
- }
- return x;
- }
- /**
- * ggT - rekursiv
- * @param x > 0
- * @param y > 0
- * @return ggT
- */
- public static int ggT_rekursiv (int x, int y) {
- if(x == y) return x;
- if(x < y) return ggT_rekursiv(y - x, x);
- return ggT_rekursiv(x - y, y);
- }
- /**
- * ggT - iterativ mit Modulo
- * @param x > 0
- * @param y > 0
- * @return ggT
- */
- public static int ggT_iterativ_modulo (int x, int y) {
- while(x != y) {
- int t = x;
- x = y;
- y = t % y;
- if(y == 0) return x;
- }
- return x;
- }
- /**
- * ggT - rekursiv mit Modulo
- * @param x > 0
- * @param y > 0
- * @return ggT
- */
- public static int ggT_rekursiv_modulo (int x, int y) {
- if(y != 0) return ggT_rekursiv_modulo(y, x % y);
- return x;
- }
- }