Największy wspólny dzielnik

0

Cześć! Czy taki sposób obliczenia NWD jest ok?

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class NWD {
    public static void main(String[] args) {

        int a = 128;
        int b = 82;

        List<Integer> listA = new ArrayList<>();
        List<Integer> listB = new ArrayList<>();

        for (int i = 1; i <= a; i++) {
            if ((a % i) == 0) {
                listA.add(i);
            }
        }

        for (int i = 1; i <= b; i++) {
            if ((b % i) == 0) {
                listB.add(i);
            }
        }

        Collections.sort(listA);
        Collections.sort(listB);

        int NWD = 1;
        for (int i = 0; i < listA.size(); i++) {
            for (int j = 0; j < listB.size(); j++) {
                if (listA.get(i) == listB.get(j)) {
                    NWD = listB.get(j);
                }
            }
        }

        System.out.format("Największy wspólny dzielnik liczb %d,%d to %d ", a,b,NWD);
    }
}

0

Jak działa to jest OK, ale są sprytniejsze sposoby.

0

Nie, bo w rozkładzie liczby na czynniki pierwsze ten sam czynnik może się powtarzać

0
kamil napisał(a):

Nie, bo w rozkładzie liczby na czynniki pierwsze ten sam czynnik może się powtarzać

hmm.. Nie za bardzo rozumiem jaki to ma wpływ na poprawność wyniku. Nie mam tu żadnych czynników pierwszych, tylko unikalne dzielniki dla każdej liczby

2

Algorytm Euklidesa to standardowy sposób liczenia NWD. Nie dość, że bardzo szybki to jeszcze łatwy w implementacji i zwięzły. Nie ma sensu kombinować inaczej, no chyba, że chcesz zbijać stałą w oszacowaniu złożoności obliczeniowej, ale to zabawa dla zaawansowanych: https://lemire.me/blog/2013/12/26/fastest-way-to-compute-the-greatest-common-divisor/ To co sam wykombinowałeś wygląda na bardzo powolny i rozwlekły algorytm.

1 użytkowników online, w tym zalogowanych: 0, gości: 1