İzninizle bu algoritmanın mantığını açıklayayım:
Öncelikle, soruyu şu şekilde yeniden soralım:
1’den n + 1’e kadar olan ardışık tek sayılar kümesi içinde toplamı n
olan ve elemanları ardışık dizilmiş kaç tane alt küme vardır?
Şimdi, öncelikle örnek bir seriyi zihnimizde bir canlandırmaya çalışalım:
n = 99 olsa;
99’un kendisi bir tek sayı olduğu için ve [99]
alt kümesinin elemanlarının toplamı 99
olduğu için, [n]
, range(1, n + 1, 2)
'in alt kümesi olur. n
çift sayı olursa [n]
bir alt küme olmaz.
99’un yarısı 49.5, bu değeri 49’a yuvarlıyorum. 49’un 2 eksiği 47, 2 fazlası 51, 47 + 51 = 98. Zaten ardışık da değiller, aralarındaki fark 2 değil 4. Dolayısıyla range(1, n + 1, 2)
kümesinin toplamı n
olan 2 elemanlı bir alt kümesi yokmuş.
range(1, n + 1, 2)
kümesinin toplamı n
eden 3 elemanlı bir alt kümesi var mı bakalım: 99 / 3 = 33. 33 merkezde yer alan değer, 2 eksiği 31, 2 fazlası 35 olur. Bu 3 değeri toplayalım 31 + 33 + 35 = 99. Demek ki range(1, n + 1, 2)
kümesinin toplamı n
eden 3 elemanlı bir alt kümesi varmış.
Dolayısıyla, burada n
’i sürekli d
isminde bir bölene bölüp, o bölümde yer alan alt kümenin ne olduğunu buluyoruz. Sonra bu alt kümenin elemanlarını toplayıp, toplamın n’e eşit olup olmadığını ve küme elemanlarının ardışık olup olmadığını buluyoruz. Çünkü yukarda gördüğünüz gibi, alt kümenin uzunluğu çift sayı ve böleni 2
olduğunda, tam merkezde yer alan n // 2
değeri düşer. dolayısıyla elemanlar arasındaki fark 4
’e çıkar.
Örneğin:
[47, 51]
Bu yukardaki işlem, bölen
sürekli 2 artırılarak devam eder. 1 artırmıyoruz çünkü n
sayısı tekse elemanlarının toplamı tek olan ve uzunluğu çift sayı olan bir alt küme olamaz. Veya, n sayısı çiftse, elemanlarının toplamı çift sayı olan ve uzunluğu da tek sayı olan bir alt küme olamaz. Dolayısıyla artırmayı 2 birim yapmak lazım.
n = 99 için, döngü şöyle values
değerleri üretir:
kümeler, toplam
[99] 99 # 1.
[31, 33, 35] 99 # 2.
[15, 17, 19, 21, 23] 95
[9, 11, 13, 15, 17, 19, 21] 105
[3, 5, 7, 9, 11, 13, 15, 17, 19] 99 # 3.
[-1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 99
3 # Toplam alt küme sayısı
while
döngüsü, üretilen alt küme, range(1, n + 1)
aralığından çıkmaya başladığı zaman yani values = [-1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
durumunda durdurulur.