Project Euler 1: 3 ve 5'in Katları

Soru: Eğer 10'un altında kalan ve 3 ile 5'in katları olan bütün doğal sayıları sıralarsak: 3, 5, 6 ve 9'u elde ederiz. Bu sayıların toplamı da 23'tür.
1000'den küçük 3 veya 5'e bölünen tüm sayıların toplamları nedir?

Project Euler'in ilk sorusu oldukça basit bir soru. Soru numarası arttıkça soruların zorluğu da artıyor. Bu soru 30 Haziran 2016 itibariyle 574622 kişi tarafından çözülmüş durumda.

Çözüm

Bizden istenen 'in altında veya 'in bölenlerini bulup, bunları toplamamız. Bu soruda dikkat etmemiz gereken nokta, bize sorunun açıklamasında açıkça gösterilmemiş. 'a kadar olan ve 'in katlarında bu iki sayının ortak katı yok. Örneğin 20'ye kadar olan sayılar için elde edeceklerimiz olacaktır. Fakat burada bir problem var! sayısı hem 'e hem de 'e bölünüyor

Eğer yazdığınız program 'e bölünen sayıları ayrıca topluyor, 'e bölünenleri ayrıca topluyorsa, ortak katları iki kez toplama katacaktır. Bu da yanlış sonuç bulmanız demek. İsterseniz her ikisini ayrı ayrı toplayıp, bu genel toplamdan ortak katları da çıkarabilirsiniz.

Böyle bir yaklaşım en basit yaklaşımdır. Şu an için bir problem yok, fakat sayılar büyüdüğünde ve yapılacak işlem arttığında böylesine kaba yaklaşımlar bizim işlem süremizi aşırı uzatarak problemi çözmemizi engelleyecektir. Öncelikle bu kaba çözüme bir bakalım, ardından kodumuzu nasıl hızlandırabileceğimizi düşünelim.

for (int i = 1; i < 1000; i++)
{
    if (i % 3 == 0)
        toplam += i;
    else if (i % 5 == 0)
        toplam += i;
    else if (i % 15 == 0)
        toplam -= i;
}

Sonuç: 233168 olarak bulunur.

Mantıksal Yaklaşım

Aslında soruda bize verilen "3 veya 5" ifadesi bir mantık operatörü içeriyor. C#'da veya operatörü || ile gösterilir. Bunu kodumuz içerisinde kullanarak biraz daha basit bir ifade elde edebiliriz.

for (int i = 1; i < 1000; i++)
{
    if (i % 3 == 0 || i % 5 == 0)
        toplam += i;
}

Matematiksel Yaklaşım

Buradaki sorulara matematiksel çözümler getirmemiz işimizi oldukça kolaylaştırıyor. Hatta bir noktadan sonra soruların zorluğu, matematiksel yöntemler kullanmayı zorunlu kılıyor. Bu sorumuzda toplamlar söz konusu olduğu için basit toplam yöntemlerini inceleyerek kağıt kalemle dahi birkaç dakikada cevabı bulmak mümkün. İsterseniz elle yapın, isterseniz metodu kullanarak programa yaptırın. Benim kağıt üzerinde hesaplayarak çözmem beş dakikamı ya aldı ya da almadı.

Kaba çözümde 'den 'e kadar olan sayıları bir bir artırarak her seferinde veya 'e bölünüp bölünmediğine bakıyorduk. Oysa ki katların toplamı şeklinde ifade edebiliriz. 3 ve katlarının toplamı olmak üzere;

\begin{equation}
N_1=3+6+9+...+999 = 3(1+2+3+...+333)
\end{equation}

Aynı şekilde için de

\begin{equation}
N_2=5+10+15+...+995 = 5(1+2+3+...+199)
\end{equation}

Ayrıca çıkarmak istediğimi 'in katlarını da aynı şekilde bulabiliriz.

\begin{equation}
N_3=15+30+45+...+990 = 15(1+2+3+...+66)
\end{equation}

Gauss yöntemini uygulayarak ardışık sayı dizilerinin toplamlarını kolaylıkla bulabiliriz. şeklinde verilen bir dizi için toplam;

\begin{equation}
N=\frac{n(n+1)}{2}
\end{equation}

şeklinde ifade edilir. Bu durumda + - işlemi bize sonucu vereceğinden cevap no'lu ifade kullanılarak aşağıdaki gibi bulunur.

\begin{equation}
3(1+2+3+...+999) = 3\frac{999*1000}{2} = 3*55611 = 166833
\end{equation}

\begin{equation}
5(1+2+3+...+199) = 5\frac{199*200}{2} = 5*19900 = 99500
\end{equation}

\begin{equation}
15(1+2+3+...+66 = 15\frac{66*67}{2} = 15*2211 = 33165
\end{equation}

Böylelikle sonuç olarak bulunur.

Ögetay Kayalı

Ögetay Kayalı

Astronom. Özel ilgi alanı teorik kozmoloji, özellikle Einstein'ın görelilik kuramının modifiye edilmesi (modified gravity) üzerine uğraşıyor. Bunların yanında ender bulduğu zaman aralıklarında kafasına esince programlama, 3B modelleme, makineler, tasarım, fotoğrafçılık, resim ve satranç ile de ilgileniyor.

Ögetay Kayalı 120 makale yazdıÖgetay Kayalı tarafından yazılan tüm makaleleri gör