ADS - Euklid

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ADS - Euklid

    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.

    Quellcode

    1. package u1;
    2. import fhw.*;
    3. public class A5 {
    4. // Standard-Modus: false
    5. // Sicherer-Modus: true (andere Ergebnise)
    6. static boolean BufferOverFlowSave = true;
    7. // Maximale Zahl
    8. static int BufferBorder = 20000;
    9. public static void main (String args[]) {
    10. int zahlen[] = ADSTool.readIntArray("u1a4.dat") ;
    11. int teiler;
    12. int nenner;
    13. int summe;
    14. int anz;
    15. String methode = "";
    16. for(int j = 1; j <= 4; j++) {
    17. summe = 0;
    18. anz = 0;
    19. ADSTool.resetTime();
    20. for(int i = 0; i < zahlen.length; i++) {
    21. if(i%2 == 0 && i < zahlen.length - 1) {
    22. if(BufferOverFlowSave) {
    23. teiler = zahlen[i] > BufferBorder ? BufferBorder : zahlen[i];
    24. nenner = zahlen[i+1] > BufferBorder ? BufferBorder : zahlen[i+1];
    25. }
    26. else {
    27. teiler = zahlen[i];
    28. nenner = zahlen[i+1];
    29. }
    30. switch(j) {
    31. case 1:
    32. summe += ggT_iterativ (teiler, nenner);
    33. anz++;
    34. break;
    35. case 2:
    36. if(BufferOverFlowSave) {
    37. summe += ggT_rekursiv (teiler, nenner);
    38. anz++;
    39. }
    40. break;
    41. case 3:
    42. summe += ggT_iterativ_modulo (teiler, nenner);
    43. anz++;
    44. break;
    45. case 4:
    46. summe += ggT_rekursiv_modulo (teiler, nenner);
    47. anz++;
    48. break;
    49. }
    50. }
    51. }
    52. switch (j) {
    53. case 1: methode = "ggT (iterativ)"; break;
    54. case 2: methode = "ggT (rekursiv)"; break;
    55. case 3: methode = "ggT (iterativ mit Modulo)"; break;
    56. case 4: methode = "ggT (rekursiv mit Modulo)"; break;
    57. }
    58. if(BufferOverFlowSave || (!BufferOverFlowSave && j != 2)) {
    59. System.out.print("==============================\n");
    60. System.out.printf("Verwendeter Algorithmus: %s\n", methode);
    61. System.out.printf("Ergebnis: %d\n",summe/anz);
    62. System.out.printf("Zeitmessung: %s\n\n",ADSTool.stringRTime());
    63. }
    64. }
    65. }
    66. /**
    67. * ggT - iterativ
    68. * @param x > 0
    69. * @param y > 0
    70. * @return ggT
    71. */
    72. public static int ggT_iterativ (int x, int y) {
    73. while(x != y) {
    74. if(x < y) {
    75. int t = x;
    76. x = y;
    77. y = t;
    78. }
    79. x = x - y;
    80. }
    81. return x;
    82. }
    83. /**
    84. * ggT - rekursiv
    85. * @param x > 0
    86. * @param y > 0
    87. * @return ggT
    88. */
    89. public static int ggT_rekursiv (int x, int y) {
    90. if(x == y) return x;
    91. if(x < y) return ggT_rekursiv(y - x, x);
    92. return ggT_rekursiv(x - y, y);
    93. }
    94. /**
    95. * ggT - iterativ mit Modulo
    96. * @param x > 0
    97. * @param y > 0
    98. * @return ggT
    99. */
    100. public static int ggT_iterativ_modulo (int x, int y) {
    101. while(x != y) {
    102. int t = x;
    103. x = y;
    104. y = t % y;
    105. if(y == 0) return x;
    106. }
    107. return x;
    108. }
    109. /**
    110. * ggT - rekursiv mit Modulo
    111. * @param x > 0
    112. * @param y > 0
    113. * @return ggT
    114. */
    115. public static int ggT_rekursiv_modulo (int x, int y) {
    116. if(y != 0) return ggT_rekursiv_modulo(y, x % y);
    117. return x;
    118. }
    119. }
    Alles anzeigen