Bir Sayının Basamak Sayısını Bulma

Bir sayının basamak sayısını bulmak için pek çok algoritma vardır ve farklı algoritmalar da yazılabilir. Birkaç ay önce yabancı bir forumda bir sayının basamak sayısının bulunmasıyla ilgili kısa bir yöntem görmüştüm ve kullanmıştım. Dün eski dosyalara göz atarken karşılaştım ve paylaşmak istedim. Kısaca tekniğe göz atacak olursak:

  1. Girilen sayı ’0′ ise doğrudan ’1′ döndürülür.
  2. Basamak sayısı bulunacak sayı ’0′ dan farklı ise mutlak değeri alınır.
  3. Sonucun 10 tabanında logaritması alınır.
  4. Elde edilen ondalık sayıdan küçük olan en büyük tam sayı bulunur. (aşağı yuvarlama)
  5. Sayıya ’1′ eklenir.
  6. Sonuç, float tipinde olduğu için istenirse int() fonksiyonuyla tam sayı cinsinden değeri alınır.

Python kodu (normal fonksiyon):

from math from *

def basamakSayisiBul ( sayi ):
          if ( sayi == 0 ):
                    return 1
          else:
                    return int( floor( log10( abs(sayi) ) ) ) +1

Python kodu (lambda, kısa):

from math from *

f = lambda x: 1 if x==0 else int( floor( log10( abs(x) ) ) ) +1
Basamak Sayısı Bulma

Basamak Sayısı Bulma

Yukarıdaki lambda tipi fonksiyon tanımlamada kullanılan koşul yapısına yeri gelmişken göz atalım. Bu gösterim, Python 2.5‘ ten itibaren geçerlidir.

[if-bloğu doğruysa yapılacaklar] if [koşul] else [koşul yanlışsa yapılacaklar]

Örnekte dikkat edilirse fonksiyon parametresi ’0′ ise ’1′ döndürülüyor. Aksi halde gerekli matematiksel işlemler yapılıp sonuç döndürülüyor.

Yararlı Bağlantılar:

http://docs.python.org/whatsnew/2.5.html#pep-308
http://eikke.com/python-ifelse-in-lambda/

  • http://friendfeed.com/hmustak Hakan Müştak

    teşekürler batu

  • http://www.atasoyweb.net Hüseyin

    Lambdalar phytonda da varmış demek :)
    Phyton bilmiyorum ama string tipine dönüşüm yapıldıktan sonra karakter sayısı hesaplanırsa bu yaklaşım daha az kod ve işlem gerektirir. Örneğin c#’ta tamsayi.ToString.length(); ifadesi bizi aynı sonuca ulaştıracaktır.

  • http://www.batuhanbayrakci.com Batuhan

    Hangisinin daha az işlem gerektireceğini bilmiyorum ama dediğin yönteme ufak bir ekleme ile negatif sayıların da basamak sayısı başarıyla alınabilir:

    int ( len( str( abs(tamsayi) ) ) )

    abs (mutlak değer) ile ‘-’ işaretinden kurtulunur aksi halde ‘-’ işareti de basamak olarak algılanır.

    Lambdaların ününü çok duydum ama kendileriyle yeni yeni tanışıyoruz :)

  • http://seraap serap

    ben bathana hak veriyorum

Yukarı