Javada İki Sayının EBOB’unu Bulma(Açıklamalı)

Merhaba arkadaşlar,bugün javada bir soruyu çözeceğiz.Ben algoritmayı değil,direkt javada kodunu yazdım.Gerekli açıklamaları kodların üzerine yazdım.Anlamadığınız yer olursa sorabilirsiniz.

Soru:Verilen iki sayının en büyük ortak bölenini(Ebob) hesaplayan bir algoritma yazınız.Örnek EBOB(162,72)=18


//Arraylist ve Scanner sinifi icin gerekli importlar
import java.util.ArrayList;
import java.util.Scanner;

public class Ebob_Algoritma_Analiz {

    public static void main(String[] args) {
        //Kod surekli tekrar etsin
        while (true) {

            //Bolenler icin integer turunde bir arraylist tanimladik
            ArrayList<Integer> arrBolenler = new ArrayList<>();

            //Giris islemleri icin scanneri tanimladik
            Scanner giris = new Scanner(System.in);

            //1.sayiyi istedik
            System.out.println("1.Sayiyi giriniz");
            int sayi1 = giris.nextInt();

            //2.sayiyi istedik
            System.out.println("2.sayiyi giriniz");
            int sayi2 = giris.nextInt();

            //Girilen sayilardan hangisi daha kucuk onu tespit ettik
            //For dongusu ona kadar calisak,cunku ortak bolenleri arıyoruz.
            int enKucukSayi = sayi1 < sayi2 ? sayi1 : sayi2;
            System.out.println("En buyuk = " + enKucukSayi);

            //2 den baslayip,enKucukSayi ya kadar olansayilari..
            //.. girilen sayilara tam bolunuyor mu diye kontrol ettik
            for (int i = 2; i < enKucukSayi; i++) {

                //Eger ikisine de tam bolunuyorsa
                if (sayi1 % i == 0 && sayi2 % i == 0) {
                    //ArraBolenler dizimize bu sayiyi ekledik
                    arrBolenler.add(i);
                }
                //Degilse bir sey yapmiyoruz zaten
            }
            //Artik bu bolenler arasinda en buyugunu bulmaya geldik.Bunun icin bir degisken tanimladik..
            //..Ve baslangic olarak dizimizdeki 1.elemani enBuyukBolen diye kabul ettik
            int enBuyukBolen = arrBolenler.get(0);

            //Tum dizide 2.elemandan baslayip dolasiyoruz
            for (int i = 1; i < arrBolenler.size(); i++) {

                //Eger dizinin elemanlarindan biri,bizim enBuyukBolen imizden buyukse,artık enBuyukBolen o olsun
                if (arrBolenler.get(i) > enBuyukBolen) {
                    enBuyukBolen = arrBolenler.get(i);
                }
                //Degilse bir sey yapma
            }

            //En son En buyuk boleni ekrana yaz
            System.out.println("En Buyuk Bolen = " + enBuyukBolen);
            System.out.println("---------------------------------");
        }

    }

}

}

Kodu kısaltmak için şöyle bir şey yaptık..Öncelikle en küçük sayıyı bulduk ki for döngümüz ona kadar devam etsin..For döngüsünde iki sayinin de i. elemana bölünüp bölünmediğini beraber kontrol ettik ve eğer bölünüyorsa arrBolenler dizimize ekledik.Üstteki kodda diziyi sıralamıştım ama mantıken zaten en son eklenen eleman,en büyük eleman olduğundan;benim sadece dizinin son elemanını almam yetiyor..Bunu da arrBolenler.size komutunun bir eksiğindeki elemanını yazdırarak bulduk(indexler 0 dan başladığı için son eleman (diziboyutu-1) deki eleman olur)..

import java.util.ArrayList;
public class EbobKisaltma {

    public static void main(String[] args) {
        int sayi1 = 162;
        int sayi2 = 72;
        int enKucukSayi = sayi1 < sayi2 ? sayi1 : sayi2;
        ArrayList<Integer> arrBolenler = new ArrayList<>();

        for (int i = 2; i <= enKucukSayi; i++) {
            if (sayi1 % i == 0 && sayi2 % i == 0) {
                arrBolenler.add(i);
            }
        }
        System.out.println("Ebob(" + sayi1 + "," + sayi2 + ")=" + arrBolenler.get(arrBolenler.size() - 1));
    }
}

Çıktı:

run:
Ebob(162,72)=18

 

Şimdi de Euclid Algoritması ile çözelim.Euclid algoritmasına göre a ve b tamsayı olmak üzere(a,b)=Ebob(a-b,b)olmaktadır.Burdan hareketle algoritma biraz daha geliştirilerek farkını almak yerine kalan(mod) operatörü kullanılır..Java kodumuz da şöyle:

public class Ebob_EuclidAlgoritmasi {

    public static void main(String[] args) {
        int sayi1 = 162;
        int sayi2 = 72;
        int enBuyuk, enKucuk, r;
        if (sayi1 > sayi2) {
            enBuyuk = sayi1;
            enKucuk = sayi2;
        } else {
            enBuyuk = sayi2;
            enKucuk = sayi1;
        }
        while (enKucuk != 0) {
            r = enBuyuk % enKucuk;
            enBuyuk = enKucuk;
            enKucuk = r;
        }
        System.out.println("Ebob(" + sayi1 + "," + sayi2 + ")=" + enBuyuk);
    }
}

Çıktı:
run:
Ebob(162,72)=18
BUILD SUCCESSFUL (total time: 0 seconds)

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir