1. sayfa
i++ demek zorunda değilsin, şunları da diyebilirsin; i = i + 2 i = i * 6 i = i + HerhangiBirMethoddanDonenSonuc veya for döngüsü hiç bitmesin istersen i = i diyebilirsin. Ki bu da do {} while(true) ile aynı işi yapmış olur. infinite loopa girmesini engellemek için ekstra kontrol yapman gerekir. Dolayısı ile while ile yapabildiğin her şeyi for ile de yapabilirsin. |
|
forda kullansan while de kullansan zaten en sonunda cli da aynı şekle bürünüyor. Mesela
şununla aynı işi yapıyor gibi.
Peki neden while yerine for kullanıyoruz? Çünkü for çok daha iyi duruyor ve okunabilirliği arttırıyor. İşleri hızlandırıyor. |
Hocam çok teşekkür ederim. Hocam şimdi de başka bir problemde takıldım. ProjectEuler'daki 7. problemdeyim. Kendim bir algoritma oluşturdum ama program butona basınca takılıyor acaba nereden hata yaptım anlamadım. Muhtemelen çok uzun süreli bir hesaplamaya girdiği için takılıyor. Problem şu; İlk 6 asal asal sayıyı listelersek(2, 3, 5, 7, 11 ve 13) 6. asal sayının 13 olduğunu görürüz. 10001. asal sayı nedir? Kendi kodlarım şu;
|
Doğrudur. Yazdığın kod arayüz threadında çalıştığı için işlem bitene kadar form yanıt vermiyor. Algoritmaları formda değil consoleda çıktı alıcak şekilde yaz. Belirli bir değere kadar bütün asal sayıları bulmana gerek yok. Ayrıca d=0da sonra break; koyabilirsin diğer bölenleri kontrol etmeye gerek yok. If döngüsünün de while içinde olması lazım. Sen K 2000000 olana kadar asal mı deil mi diye kontrol ediyorsun. Daha sonra sayaç 1001 ise sonucu veriyorsun ama 2000000a kadar 1001den çok daha fazla asal sayı var bu yüzden bi sonuç alamıyorsun. Algoritma Şöyle olabilir. int BulunanAsalSayısı=0;//(1000. asal sayıyı bulmaya çalışıyoruz o yüzden gerkeli) int SonKontrolEdilenDeğer=1; daha sonra while(BulunanAsalSayısı!=1000)//1000 tane bulana kadar { AsalMı(SonKontrolEdilenDeğer) { //eğer asalsa BulunanAsalSayısı++; } SonKontrolEdilenDeğer+=2;//çift sayılar asal olmayacağındna ötürü } return SonKontrolEdilenDeğer;//1000. asal sayı Yalnız 1000 asal sayıya kadar bütün asal sayıları bulmak bayağı bi işlem gücü gerektirebilir bu yüzden çeşitli yollarla iş yükünü hafifletilebilir ama bu yolla sonuç bulunabilir. |
Hocam, AsalMı(SonKontrolEdilenDeğer) { //eğer asalsa BulunanAsalSayısı++; } bu kısmı nasıl kontrol edeceğim. Yani ben kendi kodumda asal mi değil mi diye for döngüsü ile kontrol ediyordum. Yani sizin dediğiniz "sonKontrolEdilenDeğer"i i=2'den başlatıp kendisine kadar sırayla böldürtüp herhangi bir "i"ye bölünüp bölünmediğine bakıyorum. Ama doğru mu yapıyorum yanlış mı bilmiyorum. Ben de durum şöyle; while (BulunanAsalSayısı != 10001) { for (int i = 2; i < SonKontrolEdilenDeğer; i++) { if (SonKontrolEdilenDeğer % i == 0) { asalMı=false } } if (asalMı==true) { BulunanAsalSayısı++; } SonKontrolEdilenDeğer += 2; } Bu doğru mu acaba, formda çalışmıyor (daha doğrusu donuyor) ama konsolda denemedim birazdan düzenleyip konsolda da deneyeceğim. Bir de burada "SonKontrolEdilenDeğer" neden 1'den başlıyor? 2'den başlatmak daha doğru değil mi, asal sayılar 2'den başlar? Hatta direk 3'ten de başlatabiliriz o 2'yi de sonradan işleme dahil ederiz. 3'ten başlarsak direk 2 arttırabiliriz. |
internette çok var örnekleri
|
İşlem gücünü hafifletmek için sayının kökünü alıp ondan daha küçük asal sayılara bölünüp bölünmediğine bakabilirsin. Mesela 59 sayısı kökü yaklaşık 8 dir 7 5 3 2 ye bölünmediğine göre asaldır. Veya 17*19 = 323, kökünü alırsan yaklaşık 18 çıkar ve sayı 17ye bölünüyor asal değil.![]() |
.kök, Gökşen'in kod bahsettiğin bir-küçük-kare-kökü algoritmasını veya ona çok yakın birşeyi uyguluyor denedim hızlı şekilde calıştı ancak kodu kendi sistemime uyarlamak için değişken ve fonk isimlerini düzenlemek zorunda kaldım. SaplıBardak kodları konsol uygulaması olarak gönderirsen daha iyi olur, tabi ki daha kolay denenmesini istiyorsan .) < Resime gitmek için tıklayın > |
Başlığı okuyup geldim. Yazıları okumadım ama belki yardımı dokunur: http://www.ardamavi.com/2016/02/algoritma-fibonacci-dizilimi-kodlari.html?m=1 |
Hocam teşekkür ederim ben bu soruyu geçtim, 10. problemdeyim. 2 milyondan küçük asal sayıların toplamını istiyor. Uzun yoldan çözünce dakikalarca sürüyor hesaplaması. Sizin söylediklerinizi dikkate alıp yeniden daha performanslı hale getirmeye çalışacağım. |
şimdi, euler 4 probleminin çözümünü cok daha kısa ve hızlı yapan bir kod yazmay calışıyorum onu bitirir bitirmez bu bahsettiğim soruya döneceğim. |
Aslında forumda bu problemlerle ilgili hiç bu tarz bir konu yok. Ben açmayı düşündüm ama üşendim. Milletin birbiriyle direkt hazır kodu vermeden nasıl yapılabilir, mantığı nedir tarzı fikir alışverişinde bulunabileceği bir konu olsa fena olmaz. |
yine internetten arakladım :)
|
Hocam henüz class'ları bilmiyorum, düz yöntemle sizin yaptığınız gibi i<k yerine i*i <=k yaptım ve oldu ama gene performansı düşük "12-13 saniye" sürüyor hesaplaması. Bunu daha nasıl performanslı yapabiliriz? Kodumun son hali bu;
|
listboxa ekleme uzun sürebilir toplam bulmada şart değil eklemek ayrıca listboxa o şekil eklersen çok uzun sürer List<int> list = new List<int>(); list.Add(i); listBox1.DataSource = list; şeklinde kullansan daha hızlı olur |
Listbox'u deneme amacıyla eklemiştim, komple listelemeyi kaldırdım sadece toplamı yazdırdım ve işlem süresi 1 saniyeye indi. Şimdi 12. problemde takıldım. Gerçekten Euler'deki problemler insanı uğraştırıyor hocam biliyorum çok soru sordum ama bana bir de şu 12. problem için yardımcı olabilir misiniz yani nerede hata yaptığımı göremiyorum, kodum aşağıda, sizden ricam hazır kod vermek yerine nerelerde hata yaptığımı belirtmeniz. Aşağıdaki kodu hem konsol ve hem form üzerinde denedim ikisinde de bekliyor sadece, sonuç vermiyor.
|
Aga siz neden bahsediyorsunuz? Ben hiç bir şey anlamadım. (yazılıma yeni başlayan bir arkadaşınız) |
1. sayfa
""Fibonacci serisinde her sayı, kendisinden önce gelen iki sayının toplamıdır. 1 ve 2 ile başlayan serinin ilk 10 sayısı:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Bu serinin dört milyondan küçük tüm çift sayılarının toplamını bulunuz.""
Benim sormak istediğim şeyse, bu problemi for döngüsü kullanarak nasıl yapabiliriz? While ile yapılıyor bunu biliyorum ama ben for'la yapmak istesem nasıl yapabilirim? Çünkü şu var for'da "i" veya her ne değişken atadıysak onu 1 arttırıyoruz, (i++) burada işte dananın kuyruğu kopuyor.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.