Python ile Girilen Sayının Basamak Sayısını Bulma
Bu örneğimizde, Python ile kullanıcı tarafından girilen bir sayının kaç basamaklı olduğunu bulan örnek bir program kodlayacağız.
1. İlk çözüm yolunda while döngüsü kullandık. Bakınız:
sayi_gir = input("Lütfen basamak sayısını merak ettiğiniz sayıyı giriniz:")
# ondalık kısmı ayır
tam_kisim = int(float(sayi_gir))
# sayı negatifse pozitife çevir
if tam_kisim < 0:
tam_kisim = -tam_kisim
sayac = 0
while tam_kisim > 0:
tam_kisim = tam_kisim // 10
sayac += 1
print("Girdiğiniz sayının tam kısmının basamak sayısı:", sayac)
Yukarıdaki kodumuz, öncelikle kullanıcının girdiği sayıyı bir float’a çevirir, sonra bu float’ı bir int’e çevirir. Bu sayede kullanıcı tarafında ondalıklı sayı girilmişse onun ondalık kısmını atabileceğiz. Daha sonrasında da kullanıcı tarafından girilen sayının negatif olup olmadığını kontrol edebileceğiz. Bu sayede, negatif sayılar da kontrol edilmiş olur.
2. İkinci çözümde ise importh math yaparak çözüme ulaşacağız. Bu sayede negatif sayılar için ekstra bir işlem yapmamız gerekmeyecek. Bakınız:
sayi_gir = input("Lütfen basamak sayısını merak ettiğiniz sayıyı giriniz:")
# ondalık kısmı ayır
tam_kisim = abs(int(float(sayi_gir)))
sayac = 0
while tam_kisim > 0:
tam_kisim = tam_kisim // 10
sayac += 1
print("Girdiğiniz sayının tam kısmının basamak sayısı:", sayac)
3. Üçüncü çözümde ise sayının basamak sayısını bulmak için daha basit ve güvenilir bir yol olarak sayıyı stringe dönüştürüp bunun uzunluğunu alabiliriz:
sayi_gir = float(input("Lütfen basamak sayısını merak ettiğiniz sayıyı giriniz:"))
if sayi_gir == 0:
print("0 girdiniz...")
else:
tam_kisim = abs(int(sayi_gir))
basamak = len(str(tam_kisim))
print("Girdiğiniz sayının tam kısmının basamak sayısı:", basamak)
Yukarıdaki versiyonumuzda kodumuz, girilen sayının tam kısmının basamak sayısını hesaplar ve ekrana basar. Ondalık kısmı dikkate almaz. Negatif sayılar da dahil edilir.
4. Ve son olarak da len()
metodunu kullanarak çözelim:
sayi_gir = input("Lütfen basamak sayısını merak ettiğiniz sayıyı giriniz:")
# Sayının ondalık kısmı var mı diye kontrol eder.
if '.' in sayi_gir:
tam, ondalik = sayi_gir.split('.')
# Tam kısmın basamak sayısını hesaplar.
if int(tam) >= 0:
tam_basamak = len(tam)
else:
tam_basamak = len(tam) - 1
# Ondalık kısmın basamak sayısını hesaplar.
ondalik_basamak = len(ondalik)
print("Girilen sayının tam kısmının basamak sayısı:", tam_basamak)
print("Girilen sayının ondalık kısmının basamak sayısı:", ondalik_basamak)
else:
if int(sayi_gir) > 0:
print("Girilen sayının basamak sayısı:", len(sayi_gir))
elif int(sayi_gir) == 0:
print("Girilen sayının basamak sayısı:", 1)
else:
print("Girilen sayının basamak sayısı:", len(sayi_gir) - 1)
Kodumuz, kullanıcıdan bir sayı istiyor ve girdiği sayının basamak sayısını belirliyor. Kullanıcı bir sayı girdiğinde ise öncelikle sayının pozitif, negatif ya da sıfır olup olmadığı kontrol ediliyor. Eğer girilen sayı pozitifse, girdinin uzunluğu (yani karakter sayısı) doğrudan basamak sayısı olarak alınıyor. Eğer girilen sayı sıfırsa, basamak sayısının 1 olduğu belirtiliyor. Eğer girilen sayı negatifse, girdinin uzunluğundan bir çıkarılıyor (çünkü negatif işareti basamak sayısına dahil edilmiyor). Bu şekilde, girilen sayının basamak sayısı belirleniyor ve ekrana yazdırılıyor.
5. Son olarak örneğimizi biraz değiştirelim. Kullanıcı basamaktaki sayıyı hesaplamayı istemiş olsun, örneğin bir sayının sadece yüzler basamağındaki rakamı bulmak istesin diyelim. Bunun için, sayıyı basamaklarına ayırıp istenen basamaktaki değeri bulabileceğimiz bir kod yazabiliriz. Bakınız:
# Kullanıcıdan bir sayı al
sayi_gir = input("Lütfen bir sayı giriniz: ")
# Hangi basamağı görmek istediğini sor
basamak = int(input("Hangi basamaktaki rakamı öğrenmek istiyorsunuz? (1: Birler, 2: Onlar, 3: Yüzler, ...): "))
# Ondalık kısmı var mı kontrol et
if '.' in sayi_gir:
tam, ondalik = sayi_gir.split('.')
else:
tam = sayi_gir
# Negatif sayı ise işareti göz ardı et
if tam.startswith('-'):
tam = tam[1:]
# Tamsayı kısmının uzunluğunu kontrol et
if basamak <= len(tam):
# İstenilen basamağı hesapla (soldan sağa doğru indeksleme için)
basamaktaki_rakam = tam[-basamak]
print(f"Girilen sayının {10**(basamak-1)}'ler basamağındaki rakam: {basamaktaki_rakam}")
else:
print(f"Girilen sayı {basamak}'ıncı basamağa sahip değil.")
Son kodumuz, kullanıcıdan bir sayı ve bu sayının hangi basamağındaki rakamı görmek istediğini alarak çalışır. İlk olarak, kullanıcının girdiği sayıyı kontrol eder; eğer sayı ondalıklıysa, yalnızca tam kısmı üzerinde işlem yapar. Negatif işaretli sayılarda ise işaret yok sayılarak yalnızca sayı değerine odaklanılır. Daha sonra, kullanıcının belirttiği basamağı kontrol eder ve sayının uzunluğu ile kıyaslar. Eğer istenen basamak, sayının sahip olduğu basamakların içinde yer alıyorsa, bu basamaktaki rakamı tespit etmek için sondan sayma yöntemini kullanır. Sonuç olarak, kullanıcıya bu basamaktaki rakamı açıkça ifade eder. Ancak, eğer kullanıcı bir sayının sahip olmadığı bir basamağı sorgularsa, kod bunu fark eder ve kullanıcının istediği basamağın mevcut olmadığını belirten bir mesaj verir. Örnek girdiye göre çıktı şu şekilde olacaktır:
#girdi
Lütfen bir sayı giriniz: 134
Hangi basamaktaki rakamı öğrenmek istiyorsunuz? (1: Birler, 2: Onlar, 3: Yüzler, ...): 3
#çıktı:
Girilen sayının 100'ler basamağındaki rakam: 1
İmporth math da 8 aded dokuz girdiğimde 9 adet girdiniz diyor aynı sayıdan bir kaç defa girilince basamak sayısını 1 arttırıyor sebebini anlayamadım programda hata var galiba açıklarmısınız rica etsem
Aslında bu durum kayan noktalı sayıların kesin değerlerini tam olarak temsil edememesi nedeniyle oluyor. 9999.. sayısı tam sayı diyebilirsiniz, haklısınız da ama math.log10() metodu, içine yazılan sayıyı kayan noktalı sayı yapar. Eh round() metodu da yuvarlama yaptığı için tecrübe ettiğiniz hataya yol açmakta.
Hacı anlatımda sıkıntı var
Hocam biraz daha yeşillendirsen? Eve geçince kontrol etcem
kardeş iyi güzelde bize basamaktaki sayının ne olduğunu hesaplamayı söylesen mesela 134 yüzler basamağındaki rakamı hesaplasın
Yazıyı güncelledim. Sondaki örnek çözüm sorunuzu cevaplıyor diye umuyorum. İyi çalışmalar dilerim.