Tekil Mesaj gösterimi
Alt 17 Nisan 2023, 12:12   #2
Çevrimdışı
xwerswoodx
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
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:   Kodu kopyalamak için üzerine çift tıklayın!
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:   Kodu kopyalamak için üzerine çift tıklayın!
Console.WriteLine(Convert.ToInt64(1000000.0 * (1000001.0) / 2.0));

1 yerine farklı bir sayıdan başlarsak formül şöyle olmalı;
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
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:   Kodu kopyalamak için üzerine çift tıklayın!
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
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.


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"]


Konu xwerswoodx tarafından (17 Nisan 2023 Saat 11:13 ) değiştirilmiştir.
 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları eglen sohbet reklamver