Java Mini Proje 003 - İki Sayının Ortak Bölenlerinin En Büyüğünü Bulma (OBEB)


  Bu projede iki sayının ortak katlarının en büyüğünü bulmaya çalışacağız. Bu işleme başlamadan önce ilk önce olayın özünü iyi kavramak gerekli.

Basit örnekler vermek gerekirse;
  • 1 ve 2'nin en büyük ortak katı 1'dir.
  • 2 ve 3'ün en büyük ortak katı 1'dir.
  • 12 ve 8'in en büyük ortak katı 4'tür.
  • 16 ve 16'nın en büyük ortak katı 16'dır.
  • 16 ve 24'ün en büyük ortak katı 8'dir.
  • 25 ve 15'in en büyük ortak katı 5'tir. 
  • 15 ve 10'un en büyük ortak katı 5'tir.

Bu bilgilere dayanarak aşağıdaki sonuçları çıkarabiliriz.

İki sayının ortak katı
  • Küçük sayıya eşit olabilir. (1 ve 2 örneği)
  • Küçük sayıdan daha küçük olabilir. ( 12 ve 8 , 16 ve 24 örnekleri)
  • Büyük sayıya hiçbir zaman eşit olmaz.(Eğer sayılar eşitse direkt o sayılara eşit olur.(16 ve 16 örneği))
  • İki sayı da çiftse obeb çifttir. (12 ve 8 , 16 ve 24)
  • İki sayı da tekse obeb tektir (25 ve 15)
  • Sayılardan biri tek, biri çiftse obeb tektir. (1 ve 2, 2 ve 3,15 ve 10)

Bu problemin çözümü birçok farklı yolla ele alınabilir.Çözümlerden bir tanesi şudur.
  1. Başlangıçta obeb sayisina 1 atanır.
  2. Sayıların birbirine eşitliği kontrol edilir.Eğer sayılar birbirine eşitse obeb sayısı da odur.
  3. Sayılar birbirine eşit değilse küçük sayı , geçici obeb sayısıdır.Geçici obeb sayısı küçük ve büyük sayıya bölünüp bölünemediği kontrol edilir.Bölünürse, geçici obeb sayısı ,yani küçük sayı obebdir.
  4. Geçici obeb sayısı küçük ve büyük sayıya bölünemiyorsa geçici obeb sayısı 2'ye bölünür.Çünkü geçici obeb sayısı  başlangıçta küçük sayıya atanmıştı ve bir sayının kendinden başka en büyük böleni kendisinin yarısıdır.
  5. Geçici obeb sayısı 2'ye bölündükten sonra küçük ve büyük sayıya bölünüp bölünemediği tekrar kontrol edilir.Sonuç negatifse geçici obeb sayısı artık 1'er azaltılarak işlemlere devam edilir.Çünkü , sürekli ikiye bölmede aradaki değerler atlanabilir. 25 ve 15'in obebini bulma işlemi buna örnektir.Geçici obeb sayısı ilk önce 15'tir.Kontrol işleminden sonra 7 olarak atanır.Bundan sonra tekrar 2'ye bölünürse 3 olarak atanmış olur.Fakat 25 ve 15'in obebi 5'tir.Görüldüğü gibi bu değer atlanmış olur.1'er azaltma işlemlerine devam edilerek koşul sağlandığı anda obeb sayısı da bulunmuş olur. 
  6. Eğer hiçbir koşul sağlanmazsa obeb 1 olmuş olur.
Derinlemesine Notlar
  • Sayıların her birinin tek mi çift mi olduğu araştırılabilir.Araştırma işlemine göre, yukardaki 4. maddede yer alan "Sonuç negatifse geçici obeb sayısı artık 1'er azaltılarak işlemlere devam edilir." ifadesi yerine 2'şer 2'şer azaltılma yapılabilir.
  • Çözümlerin hepsinden bahsetmedik.Obebe en basit yoldan gidilebilir.Yani obeb sayısı başlangıçta 1 alınarak 1'er 1'er arttırılarak küçük sayının yarısına kadar ilerlenebilir.Bölen her sayıda geçici obeb sayısı güncellenir.  Küçük sayının yarısına gelindiğinde işlemler biter.Artık geçici obeb sayısı gerçek obeb sayısı olmuş olur.
  • Daha farklı bir çözümse küçük sayının kendisi ve 1 dahil olmak üzere tüm bölenleri bir kenara çıkarılır ve bunlar büyük sayı üzerinde en büyük sayıdan başlamak üzere kontrol edilir.Büyük sayı, bu sayılardan birine bölündüğü anda obeb bulunmuş olur.
Main.java
package test;

public class Main {

 public static void main(String[] args) {

  System.out.println(" 1, 2\t->\t"+obeb(1,2));
  System.out.println(" 2, 3\t->\t"+obeb(2,3));
  System.out.println("12, 8\t->\t"+obeb(12,8));
  System.out.println("16,16\t->\t"+obeb(16,16));
  System.out.println("16,24\t->\t"+obeb(16,24));
  System.out.println("25,15\t->\t"+obeb(25,15));
  System.out.println("15,10\t->\t"+obeb(15,10));

 }

 public static int obeb(int a, int b) {
  int geciciObeb;
  int obeb = 1;
  int kucukSayi = -1;
  int buyukSayi = -1;
  boolean ilkSefer = true;

  if (a == b) {
   obeb = a;
   return a;
  } 
  else {
   if (a < b) {
    geciciObeb = kucukSayi = a;
    buyukSayi = b;
   } else {
    geciciObeb = kucukSayi = b;
    buyukSayi = a;
   }

   while (geciciObeb >= 2) {
    if (buyukSayi % geciciObeb == 0) {
     return geciciObeb;
    } 
    else {
     if (ilkSefer) {
      // ilk seferde 2'ye bölüyorduk.
      geciciObeb /= 2;
      ilkSefer=false;
      
     } else {
      geciciObeb--;
     
     }
    }

   }
   // program buraya kadar gelebildiyse
   // 1'den başka ortak böleni yok.
   return 1;
  }
 }

}


Yorumlar

Bu blogdaki popüler yayınlar

Java SE Ders24 - Composition (Kompozisyon)

Spring Ders20 - Aspect Oriented Programming - AspectJ Annotation Style

JSF Ders30 - Page Template (Sayfa Şablonu)