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

3 Beğeni

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.

3 Beğeni

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 Beğeni

Merhaba,
Tekrar bir soru ve çözümüne yönelik kod alıştırması yapalım.

Soru:

1
2,3
4,5,6


Yukarıdaki sayı örüntüsüne göre 20. satırda yazan en küçük sayı kaçtır?

Cevabı aşağıdaki kodlarla çözdüm.
Alternatif Çözüm Önerileri ya da yazdığım kodda eksik/fazla olduğunu düşünen varsa kritik edebilir mi?

Aklıma şöyle birkaç çözüm yolu da geldi ama kodlayamadım;

  • Oluşturduğum listeden sayıları ekrana yazdırıp, yazılanları listeden silmek,
    ( Bunun için Print komutunda Liste *listem[0:a] *gibi her zaman sıfırıncı indeksten başlayacaktı )
    ya da
  • Boş liste oluşturup, döngü ile listeye sayı ekleyerek eklenen sayıları ekrana yazdırmak.

Yazdığım Kod;

listem = list(range(1,500))
a = 0
b = 1
for i in range(20):
    print(i+1, ". satır: ", listem[a:b])
    a += i+1
    b += i+2

Çıktı;

1 . satır:  [1]
2 . satır:  [2, 3]
3 . satır:  [4, 5, 6]
4 . satır:  [7, 8, 9, 10]
5 . satır:  [11, 12, 13, 14, 15]
6 . satır:  [16, 17, 18, 19, 20, 21]
7 . satır:  [22, 23, 24, 25, 26, 27, 28]
8 . satır:  [29, 30, 31, 32, 33, 34, 35, 36]
9 . satır:  [37, 38, 39, 40, 41, 42, 43, 44, 45]
10 . satır:  [46, 47, 48, 49, 50, 51, 52, 53, 54, 55]
11 . satır:  [56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]
12 . satır:  [67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78]
13 . satır:  [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91]
14 . satır:  [92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105]
15 . satır:  [106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120]
16 . satır:  [121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136]
17 . satır:  [137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153]
18 . satır:  [154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171]
19 . satır:  [172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190]
20 . satır:  [191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210]

Merhaba, benim çözüm önerim bir formül kullanmak. Aşağıda paylaştığım web sitesi, verdiğiniz seriler için bir formül öneriyor.

def cozum(n):
    return 1 + (n-1)*(n)/2

print(cozum(20))

https://oeis.org/search?q=1+2+4+7+11&sort=&language=english&go=Search

Kod çıktısı:

>>> print(cozum(20))
191.0

Yazdığınız kodla cevap, nokta atışla doğru ama,
insan cevabın doğruluğunu kontrol etmek istiyor :slight_smile:

1 Beğeni

Bir örüntüden alınan parça o örüntüyü tanımlamaya yetmez. Ben o örüntüyü iki farklı şekilde devam ettirebilirim, çünkü bize örüntünün tanımı değil sadece bir parçası verilmiş:

1
2,3
4,5,6
8,9,10,11
1
2,3
4,5,6
7,8,9,10

Çıktısını cevaba ekledim.

Doğru söylüyorsunuz.
Aşağıdaki örüntüyü hangi mantıkla yazdığınızı öğrenebilir miyim?
(Neden 6’dan sonra 8 geldi?)

1
2,3
4,5,6
8,9,10,11

Bahsettiğim o değildi, :slight_smile:
Anlatmak istediğim “kodda yazdığın formülün, istediğim değeri verdiğini nereden bileceğim” diyen birine aşama aşama çıktı göstermek gerekirse nasıl bir kod yazmak lazım idi.

Bu nasıl hocam
(birde kodları yazarken “”" kullanmam söylendi ama bir fark yok)

“”"
a=1
l1=[1]
for i in range(100):
print(l1)
a+=1
l1.append(a)
“”"

f = lambda n: [i + 2**(n-1) for i in range(n)]
assert f(1) == [1]
assert f(2) == [2, 3]
assert f(3) == [4, 5, 6]
assert f(4) == [8, 9, 10, 11]

“”" değil, ```. Karakterler farklı, istiyorsanız buradan koplayabilirsiniz:

```
Kodlar
```

Eğer seri benim bahsettiğim şekilde gidiyorsa bunun doğruluğunu verdiğim site kanıtlıyor. Ama yine de ben kendim adım adım göstermek için şöyle bir kod yazdım.

def satirlar(sayi):
	sayac = 1
	for i in range(1,sayi+1):
		yield list(range(sayac,sayac+i))
		sayac = sayac+i

for i in enumerate(satirlar(20)):
	print(i[0]+1,". satır: ",i[1])
	

Çıktı:

1 . satır:  [1]
2 . satır:  [2, 3]
3 . satır:  [4, 5, 6]
4 . satır:  [7, 8, 9, 10]
5 . satır:  [11, 12, 13, 14, 15]
6 . satır:  [16, 17, 18, 19, 20, 21]
7 . satır:  [22, 23, 24, 25, 26, 27, 28]
8 . satır:  [29, 30, 31, 32, 33, 34, 35, 36]
9 . satır:  [37, 38, 39, 40, 41, 42, 43, 44, 45]
10 . satır:  [46, 47, 48, 49, 50, 51, 52, 53, 54, 55]
11 . satır:  [56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]
12 . satır:  [67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78]
13 . satır:  [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91]
14 . satır:  [92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105]
15 . satır:  [106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120]
16 . satır:  [121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136]
17 . satır:  [137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153]
18 . satır:  [154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171]
19 . satır:  [172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190]
20 . satır:  [191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210]

Cevabınız için Teşekkür ederim.

Teşekkür ederim,
Kodu satır satır inceleyip anlamaya çalışacağım.

1 Beğeni

Bahsedilen karakteri yazmak için;

Alt Gr ile Virgül

Tuşlarına birlikte basman yeterli. Eğer Python’a ait kod yazıyorsanız, ``` sonrası python ibaresini de yazın. (````python)

a = 1
l1=[1]
for i in range(10):
    print(l1)
    a+=1
    l1.append(a)

Bu Kodun Çıktısı istediğim sonucu vermiyor.
Çıktı:

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]

Ortada düz bir algoritma yerine kısa yol sayılabilecek bir fonksiyon var, matematiksel olarak kanıtlanması lazım. Ben o formülü gördüğümde aklıma n*(n+1)/2 formülü geldi, 1’den n’e kadar olan tam sayıların toplamı. Biraz dikkat ederseniz yukarıdaki formül bununla aynı mantıkta çalışıyor. Bu formülün kanıtını da internette kolayca bulabilirsiniz.

Çok kompleks düşünüp formül bulmaya gerek yok tabi hızlı olmak istemiyorsanız :slightly_smiling_face:. Tabi ki bu benim görüşüm. Umarım yazdığım kod yardımcı olur.

sayi=1
satir=input("Kaçıncı satırı öğrenmek istersin: ")
satir=int(satir)

for i in range(0,satir+1):
    if(i==satir):
        print(sayi)
    else:
        sayi=sayi+i

ilgini çekiyorsa ben de bir tane ekleyeyim. (aslında çok var da soru eklerim zamanla)

Eğer bir sayının kendisi hariç tam bölenleri toplamı sayıdan büyükse o sayıya zengin sayı diyoruz. Örneğin 12 nin bölenleri 1,2,3,4,6 nın toplamı 16>12 olduğu için zengin sayıdır. En küçük tek zengin sayı nedir?