- 8 Ocak 2017
- 32
- 1
Merhaba Arkadaşlar,
Kod kısmına geçmeden önce neyi çözmeye çalışacağımızdan bahsedelim.
Collazt Problemi Nedir?
2000 yılında "Clay Matematik Enstitüsü" resmi olarak Milenyum adı verilen 7 adet problemi çözebilene 1 Milyon Dolar vereceğini açıklamış. Herkes bu soruların çözülmesinin imkansız olduğunu düşünürken "Grigori Perelman" adındaki Rus abimiz 7 problemden biri olan Poincare Varsayımını çözmüş ve 2002 yılında yayınladığı bir makalede kanıtlamış.Ancak 2006 yılına kadar onaylanmayıp gerekli saygıyı göremediği için ödülü kabul etmemiş :RpS_confused:
İşte adam gibi adam :yo
Geriye Kalan 6 sorudan biride bu Collatz Problemi. Bu Problemi "Lothar Collatz" adında Alman bir matematikçi 1937 yılında tez olarak öne sunmuş. Sorumuz şu;
Bilinmeyen bir x'imiz olsun. x'e istediğiniz pozitif tam sayıyı verin.
Bu sayı çift ise 2'ye bölünecek.
Tek ise 3 katı alınıp 1 eklenecek.
Bu döngü sürekli devam edecek. Bu abimize göre bu işlemler sonucunda her sayı 1'e ulaşır. Örneğin;
x=8 ise 8/2=4 , 4/2=2 , 2/2=1
x=5 ise 5*3+1=16 , 16/2=8 , 8/2 = 4 , 4/2=2 , 2/2=1
gördüğünüz gibi sayılar sonunda hep 1'e ulaşıyor. Eğer 1'e ulaşamayan, döngü içinde kaybolan bir sayı bulursak problemi çözmüş olacağız.
Tek tek uğraşırsak oldukça uzun süreceği için C#'da basit bir döngü oluşturup deneyeceğiz.
İlk olarak neler yapacağımızı planlayalım.
1-)Kullanıcıdan döngümüzün hangi sayılar arasında çalışması gerektiğini öğrenicez.
2-)For döngümüzü oluşturup her sayı için işlemleri yaptıracağız.
3-)Kullanıcıya girdiği değerler arasındaki hiçbir sayının, problemin cevabı olmadığını ileteceğiz.
*Not: Eğer sayıyı bulursanız ileti gelmeyecektir. Zaten 1-100.000 değerlerini girince yaklaşık olarak 5 saniyede çözüyor. Girdiğiniz değerlere ve bilgisayarınızın hızına(ki çok büyük etkisi olmaz) göre ileti gelmesi uzun sürerse buldunuz demektir. Açıkçası sayı bulunduğunda kullanıcıya bildiren bir yöntem bulamadım eğer aklınıza bir yöntem gelirse yorumlarda ya da ÖM'den bilgilendirirseniz sevinirim.
Şimdi Kod kısmına geçelim;
C#'ın form görünümünde bir proje açalım.
Formumuza 2 adet textbox, 1 adet buton koyalım.
Butonun clink eventine geçelim ve kodlarımızı yazmaya başlayalım.
Kullanıcının textbox'lara girdiği sayıları çekmek için değişkenlerimizi oluşturalım.
Çok büyük sayılarla uğraşacağımız için en büyük değeri alabilen değişken türünü atamamız gerekiyor.
Decimal değişken türü bizim için uygun.
Birde işlemleri yaptırıp sonucu kontrol edeceğimiz bir değişken oluşturalım.
Değişkenimize şimdilik sayı atamadık.
Textboxlardan Değerlerimizi aldık. Şimdi for döngümüzü textboxlardan aldığımız değerlere göre oluşturalım.
sayilar değişkenimiz burda döngü her döndüğünde i'de ki değeri alacak. Böylece her sayı için işlemleri yaptırabileceğiz.(Direk i'yi denedim hata aldığım için bu değişkeni tanımladım)
Problemin yapmamızı istediği işlemleri yaptıralım. Bunun için döngü içinde döngü kullanmamız gerekli.
İşlemleri yaptırabilmek için bence en uygun döngü "Do While" döngüsü. Başka döngülerde kullanabilirsiniz(Her döngüde çalışmayabilir). Sayının tek mi çift mi olduğu konrol edilecek. Buna göre işlemler yapılacak. İşlemlerin sonucu bir değilse bir daha do while döngüsü işleyecek. 1'e ulaşana kadar sürekli devam edecek.
Şimdi buton click eventimizin altında Kullanıcıya durumu ileticez.
İşimiz bitti şimdi istediğiniz sayıları gönül rahatlığıyla deneyebilirsiniz.
*Not:Matematikçiler Yaklaşık olarak İlk 5.764.607.523.034.234.880 sayıyı denemişler ama bulamamışlar :RpS_thumbdn:
Eğer kod yazmakla uğraşmak istemiyorsanız Benim Yaptığım için TIKLAYIN!
https://www.virustotal.com/tr/file/...eb16b07a189f9249f2ecc200/analysis/1486035762/
Arkadaşlar ilk defa konu hazırlıyorum bu yüzden yanlışlarım, eksiklerim varsa kusura bakmayın.
Eleştiri ve önerilerinize açığım. İYİ FORUMLAR. :RpS_laugh::RpS_laugh:
Kod kısmına geçmeden önce neyi çözmeye çalışacağımızdan bahsedelim.
Collazt Problemi Nedir?
2000 yılında "Clay Matematik Enstitüsü" resmi olarak Milenyum adı verilen 7 adet problemi çözebilene 1 Milyon Dolar vereceğini açıklamış. Herkes bu soruların çözülmesinin imkansız olduğunu düşünürken "Grigori Perelman" adındaki Rus abimiz 7 problemden biri olan Poincare Varsayımını çözmüş ve 2002 yılında yayınladığı bir makalede kanıtlamış.Ancak 2006 yılına kadar onaylanmayıp gerekli saygıyı göremediği için ödülü kabul etmemiş :RpS_confused:
İşte adam gibi adam :yo
Geriye Kalan 6 sorudan biride bu Collatz Problemi. Bu Problemi "Lothar Collatz" adında Alman bir matematikçi 1937 yılında tez olarak öne sunmuş. Sorumuz şu;
Bilinmeyen bir x'imiz olsun. x'e istediğiniz pozitif tam sayıyı verin.
Bu sayı çift ise 2'ye bölünecek.
Tek ise 3 katı alınıp 1 eklenecek.
Bu döngü sürekli devam edecek. Bu abimize göre bu işlemler sonucunda her sayı 1'e ulaşır. Örneğin;
x=8 ise 8/2=4 , 4/2=2 , 2/2=1
x=5 ise 5*3+1=16 , 16/2=8 , 8/2 = 4 , 4/2=2 , 2/2=1
gördüğünüz gibi sayılar sonunda hep 1'e ulaşıyor. Eğer 1'e ulaşamayan, döngü içinde kaybolan bir sayı bulursak problemi çözmüş olacağız.
Tek tek uğraşırsak oldukça uzun süreceği için C#'da basit bir döngü oluşturup deneyeceğiz.
İlk olarak neler yapacağımızı planlayalım.
1-)Kullanıcıdan döngümüzün hangi sayılar arasında çalışması gerektiğini öğrenicez.
2-)For döngümüzü oluşturup her sayı için işlemleri yaptıracağız.
3-)Kullanıcıya girdiği değerler arasındaki hiçbir sayının, problemin cevabı olmadığını ileteceğiz.
*Not: Eğer sayıyı bulursanız ileti gelmeyecektir. Zaten 1-100.000 değerlerini girince yaklaşık olarak 5 saniyede çözüyor. Girdiğiniz değerlere ve bilgisayarınızın hızına(ki çok büyük etkisi olmaz) göre ileti gelmesi uzun sürerse buldunuz demektir. Açıkçası sayı bulunduğunda kullanıcıya bildiren bir yöntem bulamadım eğer aklınıza bir yöntem gelirse yorumlarda ya da ÖM'den bilgilendirirseniz sevinirim.
Şimdi Kod kısmına geçelim;
C#'ın form görünümünde bir proje açalım.
Formumuza 2 adet textbox, 1 adet buton koyalım.
Butonun clink eventine geçelim ve kodlarımızı yazmaya başlayalım.
Kullanıcının textbox'lara girdiği sayıları çekmek için değişkenlerimizi oluşturalım.
Çok büyük sayılarla uğraşacağımız için en büyük değeri alabilen değişken türünü atamamız gerekiyor.
Kod:
decimal deger1 = Convert.ToDecimal(textBox1.Text);
decimal deger2 = Convert.ToDecimal(textBox2.Text);
Birde işlemleri yaptırıp sonucu kontrol edeceğimiz bir değişken oluşturalım.
Kod:
decimal sayilar;
Textboxlardan Değerlerimizi aldık. Şimdi for döngümüzü textboxlardan aldığımız değerlere göre oluşturalım.
Kod:
for (decimal i = deger1; i < deger2; i++)
{
sayilar=i;
}
Problemin yapmamızı istediği işlemleri yaptıralım. Bunun için döngü içinde döngü kullanmamız gerekli.
Kod:
do
{
if (sayilar % 2 == 0)
{
sayilar = sayilar / 2;
}
else
{
sayilar = (sayilar * 3) + 1;
}
}
while (sayilar != 1);
Şimdi buton click eventimizin altında Kullanıcıya durumu ileticez.
Kod:
MessageBox.Show("Girdiğiniz Değerler Arasındaki Hiçbir Sayı Olmadı.");
İşimiz bitti şimdi istediğiniz sayıları gönül rahatlığıyla deneyebilirsiniz.
*Not:Matematikçiler Yaklaşık olarak İlk 5.764.607.523.034.234.880 sayıyı denemişler ama bulamamışlar :RpS_thumbdn:
Eğer kod yazmakla uğraşmak istemiyorsanız Benim Yaptığım için TIKLAYIN!
https://www.virustotal.com/tr/file/...eb16b07a189f9249f2ecc200/analysis/1486035762/
Arkadaşlar ilk defa konu hazırlıyorum bu yüzden yanlışlarım, eksiklerim varsa kusura bakmayın.
Eleştiri ve önerilerinize açığım. İYİ FORUMLAR. :RpS_laugh::RpS_laugh:
Son düzenleme: