Problem z NWD w Javie

0
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:

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

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.

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:

for (int j = i; j < min; j += i) {
  /* ... */
}
2

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

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


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.