void Button5Click(object sender, EventArgs e) { int num = 0; int num2 = 1; int fibonacci=0; List<int> list = new List<int>(); for (int i = 0; i < 100; i++) //aslında 33 { if (fibonacci < 4000000) { list.Add(fibonacci); fibonacci = num + num2; num = num2; num2 = fibonacci; }
} int toplam =list.Where(x => x % 2 == 0).Sum(); label1.Text = toplam.ToString();
Orijinalden alıntı: SaplıBardak 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.
Euler de hep öyle problemler var. ş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.
Orijinalden alıntı: SaplıBardak 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.
euler de olmayan fakat euler tarzında bir problem daha var yakında buradan yayınlayacağım. Şimdilik sadece problemin adını vereyim: Salted Factorial. Oradaki "salted" aynen passwordlerin kırılmasını zorlaştıran yöntem gibi faktöryel hesaplamayı zorlaştıran (ancak işlemi saçmalaştıracak kadar da zorlaştırmayan) bir ifade. O problemi ben çözdüm. Ancak çözümü vermeden nasıl çözülür şeklinde sorup yorumları bekleyeceğim .) Tabi ki sonunda kendi çözümümü de ileteceğim hem de 2 farklı dilde.
ş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 salted factorial sorusunu yeni konu olarak acacağım.
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.
""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 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.
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
for(int i=0;i<10;i++)
{
//kod
}
şununla aynı işi yapıyor gibi.
int i=0;
while(i<10)
{
//kod
i++
}
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;
private void button1_Click(object sender, EventArgs e) { int deger = 2000000; //Herhangi bir tahmini değere kadar olan asal sayılar incelenecek int k = 0; //asal olup olmadığı kontrol edilecek olan değer
int asalsayi = 0;
int d;
int sayac = 0;
while (k<deger) { d = 1; for (int i = 2; i < k; i++) { if (k % i == 0) { d = 0; } } if (d == 1) { asalsayi = k; sayac++; } k++; }
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.
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.
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.
İş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 .)
.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 .)
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.
public static class sayı { public static bool asalmı(int sayı) { if ((sayı & 1) == 0) { return sayı == 2; } for (int i = 3; (i * i) <= sayı; i += 2) { if ((sayı % i) == 0) { return false; } } return sayı != 1; } }
void Button2Click(object sender, EventArgs e) { double toplam = 0; for (int i = 2; i < 2000000; i++) { if (sayı.asalmı(i)) {
public static class sayı { public static bool asalmı(int sayı) { if ((sayı & 1) == 0) { return sayı == 2; } for (int i = 3; (i * i) <= sayı; i += 2) { if ((sayı % i) == 0) { return false; } } return sayı != 1; } }
void Button2Click(object sender, EventArgs e) { double toplam = 0; for (int i = 2; i < 2000000; i++) { if (sayı.asalmı(i)) {
toplam += i; } }
MessageBox.Show(toplam.ToString()); }
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;
int deger = 2000000; int k = 3; int d; long toplam=2; while(k<deger) { d = 1; for (int i = 2; i*i<= k; i++) { if (k%i==0) { d = 0; break; } } if (d==1) { toplam = toplam + k; listBox1.Items.Add(k); } k++; }
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.
private void button1_Click(object sender, EventArgs e) { int n = 1; //sayının kaçıncı sayı olduğunu tutan değişkendir. int sayi = 1; int bolenSayisi = 0;
int sayininYarisi=sayi/2; do { n++; sayi = (n * (n + 1)) / 2; for (int i = 1; i <= sayininYarisi; i++) { if (sayi%i==0) { bolenSayisi++; } } bolenSayisi++; //sayının yarısına kadar kontrol ettiğimiz için yarısından sonraki böleni ekleriz, bu da sayının kendisidir. if (bolenSayisi != 4) { bolenSayisi = 0; } } while (bolenSayisi<=500); label1.Text = sayi.ToString(); }
Yazıları okumadım ama belki yardımı dokunur:
http://www.ardamavi.com/2016/02/algoritma-fibonacci-dizilimi-kodlari.html?m=1
< Bu ileti mobil sürüm kullanılarak atıldı >
ş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.
< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 27 Haziran 2019; 13:1:44 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
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.
""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.
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.
< Bu mesaj bu kişi tarafından değiştirildi tnrsr -- 2 Eylül 2016; 17:06:33 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
ş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.
< Bu ileti mini sürüm kullanılarak atıldı > Bu mesaja 1 cevap geldi. Cevapları Gizle
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;
Bu mesaja 1 cevap geldi. Cevapları Gizle
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.
< Bu mesaj bu kişi tarafından değiştirildi Guest-42B93504E -- 3 Eylül 2016; 18:36:34 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
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.
< Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 3 Eylül 2016; 18:48:34 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
< Bu ileti DH mobil uygulamasından atıldı > Bu mesaja 1 cevap geldi. Cevapları Gizle
< Resime gitmek için tıklayın >
Bu mesaja 1 cevap geldi. Cevapları Gizle
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.
Bu mesaja 2 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
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;
Bu mesaja 1 cevap geldi. Cevapları Gizle
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
< Bu mesaj bu kişi tarafından değiştirildi Gökşen PASLI -- 5 Eylül 2016; 20:25:10 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
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.
< Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 6 Eylül 2016; 0:46:07 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
(yazılıma yeni başlayan bir arkadaşınız)