簡體   English   中英

使用素數分解的Java最大除數

[英]Greatest common divisor in java using prime factorizations

        int a;
        int b;
        int iloscA = 0;
        int iloscB = 0;
        ArrayList liczbyPierwszeA = new ArrayList();
        ArrayList liczbyPierwszeB = new ArrayList();
        Scanner liczba = new Scanner(System.in);
        System.out.println("Podaj a.");
        a = liczba.nextInt();
        System.out.println("Podaj b");
        b = liczba.nextInt();
        int a1 = a;
        int b1 = b;

        for (int i = 2; i <= a; i++) {

            while (a % i == 0) {
                // System.out.print(i + "*");
                liczbyPierwszeA.add(iloscA, i);
                iloscA++;
                a = a / i;
            }
        }

        int x = 0;
        System.out.print("Rozkład na czynniki pierwsze liczby " + a1 + "=");
        while (x < liczbyPierwszeA.size()) {
            System.out.print(liczbyPierwszeA.get(x) + "*");
            x++;
        }

        for (int i = 2; i <= b; i++) {

            while (b % i == 0) {
                // System.out.print(i + "*");
                liczbyPierwszeB.add(iloscB, i);
                iloscB++;
                b = b / i;
            }
        }
        System.out.println("");
        int y = 0;
        System.out.print("Rozkład na czynniki pierwsze liczby " + b1 + "=");
        while (y < liczbyPierwszeB.size()) {
            System.out.print(liczbyPierwszeB.get(y) + "*");
            y++;
        }

        int licznik = 0;
        ArrayList Wspolne = new ArrayList();
        int WspolneLicznik = 0;
        while (liczbyPierwszeA.get(licznik) == liczbyPierwszeB.get(licznik)) {
            Wspolne.add(WspolneLicznik, liczbyPierwszeA.get(licznik));
            licznik++;
            WspolneLicznik++;
        }
        System.out.println("");
        int z = 0;
        while (z < Wspolne.size()) {
            System.out.print(Wspolne.get(z) + "*");
            z++;
        }
    }
}

Soory需要大量代碼,但想發布到目前為止的所有內容。 素數分解很好用,現在我想比較兩個數組列表並找到共同的元素。 但是例如36和48

Rozkład na czynniki pierwsze liczby 36=2*2*3*3*
Rozkład na czynniki pierwsze liczby 48=2*2*2*2*3*
2*2*

如您所見,它無法正常工作,結果應該是2 * 2 * 3,而不是2 * 2。 如何在整個arraylist中找到常見的數字序列,而不是像我的代碼現在那樣在arraylist的開頭查找?

您的while循環僅找到兩個列表的公共前綴。 為了找到所有公共元素,您需要使用兩個索引遍歷兩個List

    int indexA = 0;
    int indexB = 0;
    while (indexA < liczbyPierwszeA.size () && indexB < liczbyPierwszeB.size()) {
        if (liczbyPierwszeA.get(indexA) == liczbyPierwszeB.get(indexB)) {
            Wspolne.add(WspolneLicznik, liczbyPierwszeA.get(indexA));
            indexA++;
            indexB++;
            WspolneLicznik++; // not sure what this counter is for. I kept it just 
                              // in case it's needed
        } else {
            if (iczbyPierwszeA.get(indexA) < liczbyPierwszeB.get(indexB))
                indexA++;
            else
                indexB++;
        }
    }

我假設兩個List的數字都按升序排序,我認為這是一個正確的假設(如果我正確理解了您的代碼)。

編輯:

還要更改要參數化的列表的聲明:

    ArrayList<Integer> liczbyPierwszeA = new ArrayList<Integer>();
    ArrayList<Integer> liczbyPierwszeB = new ArrayList<Integer>();

甚至更好:

    List<Integer> liczbyPierwszeA = new ArrayList<Integer>();
    List<Integer> liczbyPierwszeB = new ArrayList<Integer>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM