Algorytm Euklidesa

Algorytm Euklidesa
Lich555
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
0

Witam.
Napisałem algorytm Euklidesa w pętli for. Niby on działa, ale jak uzyskać końcowy wynik, np. dla liczb 72 i 48 "NWD dla liczb 72 i 48 to 24"? Mogę używać właściwie tylko tego, co jest w kodzie, pętle, instrukcje warunkowe. Bez żadnych metod czy osobnych funkcji (wiem, tak by było łatwiej, ale takie polecenie). Problem jest w zakresie wartości zmiennych. Jak to napisać?

Kopiuj
public class Main16 {

    public static void main(String[] args) {
        int x, y, gdc;
        x = 72;
        y = 48;

        for (int i = 1; y != 0; ) {
            i = x % y;
            if (i != 0) {
                x = y;
                y = i;
            } else {
                System.out.println("GDC to: " + y);     //chciałbym "GDC dla liczb 72 i 48 to 24"
            }

        }
    }

}
edytowany 1x, ostatnio: Lich555
K5
  • Rejestracja:około 6 lat
  • Ostatnio:44 minuty
  • Postów:1002
3

Odpalałeś swój kod w ogóle? Twój warunek stopu zajdzie tylko w szczególnych przypadkach (EDIT: chyba nawet nigdy nie zajdzie, w takiej formie jak to napisałeś ;) ). Nie powinieneś robić tego forem. Użyj pętli while. Coś takiego:

Kopiuj
public class TestString {

    public static int NWD(int numberA, int numberB) {
        int temp;
        while (numberB != 0) {
            temp = numberA % numberB;
            numberA = numberB;
            numberB = temp;
        }
        return numberA;
    }

    public static void main(String[] args) {

        System.out.println("result: " + NWD(72, 48));
        System.out.println("result: " + NWD(1989, 867));

    }
}
edytowany 1x, ostatnio: kixe52
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
2

Zanim zaczniesz jakiekolwiek obliczenia, przypisz wejściowe parametry do jakichś zmiennych lokalnych - inaczej utracisz informację o tym, jakie liczby weszły na początku ;)

K5
Lich555
Jeśli mówisz o zmiennej gdc to sorry, ale wkleiłem zły kod. W poście poniżej jest wersja, którą miałem na myśli od początku.
Lich555
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 4 lata
  • Postów:35
0

Teraz zauważyłem, że wkleiłem złą wersję mojego kodu, przepraszam. Wiem, że ta też nie jest najlepsza, ale o tą mi chodziło.

Kopiuj
public class Main16 {

    public static void main(String[] args) {
        int x, y;
        x = 72;
        y = 48;

        for (int i = 1; y != 0; ) {
            i = x % y;
            if (i != 0) {
                x = y;
                y = i;
                continue;
            } else {
                System.out.println("GDC to: " + y);
                break;
            }

        }
    }

}

Dzięki za Twoją wersję, ale nie o to mi chodziło. Tak jak napisałem w głównym poście, program powinien być cały w mainie, bez innej funkcji. Chodziło mi też o to, żeby na końcu wypisać obie liczby i ich NWD. W mojej wersji jest to niemożliwe, bo zmienne zmieniają swoją wartość w pętli. Da się tego jakoś uniknąć bez tworzenia dodatkowej funkcji?
Tutaj wersja z while:

Kopiuj
public class Main16 {

    public static void main(String[] args) {
        int x, y, temp;
        x = 72;
        y = 48;

        while (y != 0) {
            temp = x % y;
            x = y;
            y = temp;
            }
        System.out.println("GDC to: " + x);

    }
}
edytowany 2x, ostatnio: Lich555
BO
  • Rejestracja:około 6 lat
  • Ostatnio:3 dni
  • Postów:214
0

Przecież już dostałeś informację ,że musisz sobie je skopiować.

Kopiuj
int xCopy=x;

I wtedy masz dostępną niezmienioną wartość.

edytowany 2x, ostatnio: Botek
K5
  • Rejestracja:około 6 lat
  • Ostatnio:44 minuty
  • Postów:1002
1
Lich555 napisał(a):

Dzięki za Twoją wersję, ale nie o to mi chodziło. Tak jak napisałem w głównym poście, program powinien być cały w mainie, bez innej funkcji. Chodziło mi też o to, żeby na końcu wypisać > obie liczby i ich NWD. W mojej wersji jest to niemożliwe, bo zmienne zmieniają swoją wartość w pętli. Da się tego jakoś uniknąć bez tworzenia dodatkowej funkcji?

Przepraszam, że nie wykonałem polecenia w 100% poprawnie. Specjalnie napisałem tak jak napisałem, abyś chociaż trochę się wysilił i wybrał z mojej odpowiedzi to co najważniejsze, czyli fragment z pętlą while. Dlaczego? Bo Twoja wersja była daleka od właściwego rozwiązania.

Widzę, że jakoś sobie poradziłeś, gratuluję.
Teraz przeczytaj odpowiedzi @Pinek oraz @Botek i będziesz miał rozwiązanie na resztę problemów.

edytowany 1x, ostatnio: kixe52

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.