Matematik Alıştırmaları

Herkese Merhaba,
Twitter’da takip ettiğim Matematik Dünyası (@Math_World_) isimli kullanıcının bazı sorularını, Python kodları ile çözmeye çalışarak alıştırma yapıyorum.
Hem İlgilenen arkadaşlara haber vermek, hem alternatif çözümler öğrenmek hemde benzer soruları paylaşmak isteyenler için mesaj göndermek istedim.
Soru ve çözümler ileri matematik içermiyor, maksat, pratik yapmak ve yeni bilgiler öğrenmek. Umarım Faydalı olur.

SORU 1: Rakamları toplamının 7 katına eşit olan iki basamaklı kaç tane doğa sayı vardır?

Çözüm:

for sayi in range (10,100):
	if (sayi == (int(str(sayi)[0])+ int(str(sayi)[1]))*7):
		print (sayi)

Çıktı:

21
42
63
84

1

SORU 2: Karekökü rakamları toplamına eşit olan sayı kaçtır?
Çözüm: Bu sorunun çözümünde math (matematik) modülünün sqrt metodundan faydalandım.
https://belgeler.yazbel.com/python-istihza/standart_moduller/math.html#math-sqrt

#Tek haneli sayılarda, karekökü kendisine eşit olan, 2 ve yukarı haneye sahip sayılarda, karekökü rakamları toplamina esit ilan sayılar (1 ile 10.000 arası);


import math

for sayi in range(1,10000):
	a = str(sayi)
	if (len(a) == 1):
		if (math.sqrt(sayi) == (int(a[0]))): # karekoku kendisine esit olan sayi icin "== sayi" da yazilabilir.
			print (sayi)
			
	elif (len(a) == 2):
		if (math.sqrt(sayi) == (int(a[0]) + int(a[1]))):
			print(sayi)
			
	elif (len(a) == 3):
		if (math.sqrt(sayi) == (int(a[0]) + int(a[1]) + int(a[2]))):
			print (sayi)
			
	elif (len(a) == 4):
		if (math.sqrt(sayi) == (int(a[0]) + int(a[1])) + int(a[2]) + int(a[3])):
			print (sayi)

Çıktı:

1
81

1 Like

Merhaba, öncelikle ellerinize sağlık. Yukarıda verdiğiniz problemler a-b aralığındaki sayılarda denensin diye ortaya atılmış değiller aslında.

Öncelikle ilk soruyu ele alalım, “Rakamları toplamının 7 katına eşit olan iki basamaklı kaç tane doğal sayı vardır?”

İki basamaklı, bu koşulu sağlayan sayıları aradığımızdan sayılar için genel olarak ab ifadesini kullanabiliriz. (Burada a*b işlemini göstermek istemedim ab = 10a + b iki basamaklı bir sayı). Bizden istenen şey, 7(a + b) = 10a + b işleminin çözüm kümesi. Buradan 3a = 6b => a = 2b eşitliği geliyor, hatırlarsanız sayılarımızı ab = 10a + b şeklinde belirtmiştik, burada a yerine 2b yazarsak istediğimizi elde etmiş olacağız: 10(2b) + b = 21b. Artık 21b ifadesinde b’ye vereceğiniz doğal sayılar (0 < 21b < 100 olacak şekilde) istenen koşulu sağlıyor olacaktır.

Benzer bir mantığı ikinci soruya da uygulayabilirsiniz.

Burada size anlatmak istediğim, biz programcılar mecbur kalmadıkça bu tür problemler için brute force kullanmayız, çünkü çok kaynak kullanan bir yöntemdir.

Elbette alıştırma yapmak için herhangi bir şey yazmak güzel bir şey. Mesela ikinci soru için yazdığınız çözüm çok kötü, aşağıdaki gibi yazabilirsiniz.

def func(a, b):
    for num in range(a, b):
        if num ** 0.5 == sum(map(int, str(num))):
            yield num

Bu fonksiyon bir generator döndürüyor. Sayı uzunluğı ne kadar olursa olsun, onları toplayıp karşılaştırma yapmak daha mantıklı, her uzunluk için bir if bloğu yazmanın gereği yok.

Tekrardan ellerinize sağlık, umarım anlatmak istediklerimi aktarabilmişimdir.

1 Like

Cevabınız için Teşekkür ederim.
Acem bir Python kullanıcı olarak mevcut bilgimle bu kodları yazdım. (ikinci soru için yazdığım çözümün çok kötü olduğunun farkındayım :slight_smile: )
Bazı konuları okumuş olsam da tam olarak anlayamadığımı, sizler gibi deneyimli kullanıcıların cevaplarında fark ediyorum.
İnşallah forum sayesinde daha iyiye yol alacağım.

1 Like