Problem z NWD w Javie

C0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0
Kopiuj
public class GreatestCommonDivisor {
    public static int getGreatestCommonDivisor (int first, int second) {
        if (first < 10 || second < 10) {
            return - 1;
        }

        int min, max;
        if (first < second) {
            min = first;
            max = second;
        } else {
            min = second;
            max = first;
        }

        int greatestCommonDivisor = 1;
        for (int i = 1; i < min; i++) {
            for (int j = i; j < min; j++) {
                if ((min % i == 0) && (max % j == 0)) {
                    greatestCommonDivisor = i;
                }
            }
        }

        return greatestCommonDivisor;
    }
}

Witam. Mój program wywala się, gdy umieszczę w nim dane 81 i 153. Zwraca wtedy wartość 27 i nie wiem czemu. Przeanalizowałem działanie programu i wg mnie taka sytuacja nie powinna mieć miejsca. W miejscu:

Kopiuj
if ((min % i == 0) && (max % j == 0)) {
                    greatestCommonDivisor = i;
                }

kiedy i= 27 i j zaczyna też z wartością 27, to jak jest możliwe, żeby oba warunki zostały spełnione (153 nie dzieli się modulo przez 27) i greatestCommonDivisor przyjął wartość 27?
Pewnie nie widzę jakiegoś mankamentu, ale już nie mam pomysłu.

Proszę i dziękuję za pomoc,

Pozdrawiam

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
2

Twój warunek max % j == 0 oznacza, że - aby wykonało się greatestCommonDivisor = i; - max musi się podzielić przez dowolną liczbę z zakresu 27..153; taką liczbą jest przykładowo 51.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

A czy dałoby radę w jakiś prosty sposób zmodyfikować ten kod, zmienić jakiś warunek, żeby działał poprawnie?

A dałoby :-)

Wydaje mi się, że musiałbyś mieć coś takiego:

Kopiuj
for (int j = i; j < min; j += i) {
  /* ... */
}
RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
2

Przepraszam, za offtop, ale czy nie wygodniej zrobić coś takiego?

Kopiuj

int gcd(int a, int b){
return (b==0) ? a : gcd(b, a%b);
}

Kopiuj

Będzie szybciej, czytelniej i mniej miejsca na błędy :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.