IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   C# (https://www.ircforumlari.net/c/)
-   -   1′den 1000′e kadar olan sayıların toplamını bulup sonucu ekranda gösteren program (https://www.ircforumlari.net/c/744053-18242den-10008242e-kadar-olan-sayilarin-toplamini-bulup-sonucu-ekranda-gosteren-program.html)

Kaf_Dağı 21 Mart 2016 14:30

1′den 1000′e kadar olan sayıların toplamını bulup sonucu ekranda gösteren program
 
Kod:

int toplam = 0;
for (int i = 0; i <= 1000; i++)
{
toplam += i;
}
 
Console.WriteLine("Toplam = {0}", toplam);
Console.ReadKey();


xwerswoodx 17 Nisan 2023 12:12

Cevap: 1′den 1000′e kadar olan sayıların toplamını bulup sonucu ekranda gösteren program
 
Hani bunun için bu kadar uzun 1000 döngülük sorgu yapmak yerine, güzelim matematiğimizin güzelim imkanlarını kullansak daha iyi olmaz mı.

Bir sayı kümesindeki sayıların toplamını bulmanın çok basit bir fomülü var;

Alıntı:

Sn = (bitiş - (başlangıç - 1)) * ((başlangıç + bitiş) / 2)
Bu formülle 1 ile 1000 arasındaki sayıların toplamını konsola bu şekilde basitçe yazdırabiliriz.
Kod:

Console.WriteLine(Convert.ToInt64(1000.0 * (1001.0) / 2.0));
Bu formülün iyi yanı 10000000 tane veriyi bile sorgulamadan kolaylıkla hesaplayabilirsin
Kod:

Console.WriteLine(Convert.ToInt64(1000000.0 * (1000001.0) / 2.0));
1 yerine farklı bir sayıdan başlarsak formül şöyle olmalı;
Kod:

Console.WriteLine(Convert.ToInt64((728.0 - (18.0 - 1.0)) * ((18.0 + 728.0) / 2.0)));
Burada 18-728 arasını aldık mesela.

Niye float kullandığıma da gelirsek, integer noktalı sayılardan oluşamaz ve toplamı 2 ye böldüğümüz durumlar var bu nedenle çarpmada 0.5lik sapmalar olmaması için float olarak kullanılması gerekir.

Artış belirtilen sayılarda formül az daha karışıyor çünkü kalan değerler giriyor ortaya mesela 7-100 arasındaki her 5 sayıyı alırsak 97 son değer olmalı yani -3 lük bir kayma söz konusu bunun için ise formül;

Alıntı:

Sn = (((bitiş - kalan((bitiş - başlangıç) / artış)) - (başlangıç - artış)) / artış) * ((başlangıç + (bitiş - kalan((bitiş - başlangıç) / artış))) / 2)
şeklinde olmalıdır.
Artışlı sayılara da örnek vereyim, mesela 7 ile 100000 arasındaki her 5 rakamı toplamak istiyoruz diyelim 5+10+15+20 gibi
Kod:

Console.WriteLine(Convert.ToInt64((((100000.0 - ((100000.0 - 7.0) % 5.0)) - (7.0 - 5.0)) / 5.0) * ((7.0 + (100000.0 - ((100000.0 - 7.0) % 5.0))) / 2.0)));
Her ne kadar buradan bakınca karmaşık görünse de büyük sayılar işin içine girdiğinde optimizasyonu ancak bu şekilde matematiğin faydalarını kullanarak sağlayabiliriz. 1000 sorgu c# için saliseler içinde yapılabilecek bir şey olabilir, ancak formüllerle bunu hiç bir sorgu yapmadan çok daha optimize bir şekilde yapmak mümkün. O yüzden matematiği sevelim :)

Arithmetic Sequence nedir, formülleri nasıldır buradan bakabilirsiniz;
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...].
Türkçe kaynak:
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...].[COLOR="Silver"]


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 03:36.

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net