1 Milyon Dolarlık Soruyu Çözen Kod Yazmak

callousclown

Yeni üye
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.
Kod:
 decimal deger1 = Convert.ToDecimal(textBox1.Text);
 decimal deger2 = Convert.ToDecimal(textBox2.Text);
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.
Kod:
decimal sayilar;
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.
Kod:
for (decimal i = deger1; i < deger2; i++)
 {
   sayilar=i;
 }
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.
Kod:
do
 {

    if (sayilar % 2 == 0)
   {
      sayilar = sayilar / 2;
   }
   else
   {
      sayilar = (sayilar * 3) + 1;
   }
 }
 while (sayilar != 1);
İş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.
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:

jagged

Uzman üye
29 Eyl 2012
1,432
0
C:\
Oncelikle ilk konun olmasına rağmen beğendim. Mantık da güzel fakat bunu senden önce düşünen binlerce insan olduğununda farkindasindir. Gene de potansiyelin var yolun açık olsun.
 

AJEXA

Adanmış Üye
22 Haz 2013
6,859
3
Jüpiter
Ben buldum ama kimseye söylemiycem :trl
Aslında cevap çok basit. ;)
üstelik o kadar sayı aramanın lüzmü yok :)

Peki söylüyorum
Cevap : R- (Negatif reel sayılar kümesi )

x=-1 için
-1.3=-3
-3+1=-2
-2/2=-1 ;)
Döngü böyle devam eder. Bu, tüm negatif sayılar için geçerlidir ;)

x= -1/2 (çift sayı)
2. -1/2=-1 (Devamı yukardaki örnekte :D )

x=-1/3(tek sayı)
3.-1/3=-1


Örnekler devam ettirilebilir. Çok var :D
 
Son düzenleme:

callousclown

Yeni üye
8 Ocak 2017
32
1
Peki söylüyorum
Cevap : R- (Negatif reel sayılar kümesi )

x=-1 için
-1.3=-3
-3+1=-2
-2/2=-1 ;)
Döngü böyle devam eder. Bu, tüm negatif sayılar için geçerlidir ;)

x= -1/2 (çift sayı)
2. -1/2=-1 (Devamı yukardaki örnekte :D )

x=-1/3(tek sayı)
3.-1/3=-1


Örnekler devam ettirilebilir. Çok var :D

Kardeşim kusura bakma belirtmeyi unutmuşum sadece pozitif tam sayılar için geçerli bir durum bu.
 

ByKaranlikGece

Kıdemli Üye
27 Mar 2016
2,543
2
Cc+
Peki söylüyorum
Cevap : R- (Negatif reel sayılar kümesi )

x=-1 için
-1.3=-3
-3+1=-2
-2/2=-1 ;)
Döngü böyle devam eder. Bu, tüm negatif sayılar için geçerlidir ;)

x= -1/2 (çift sayı)
2. -1/2=-1 (Devamı yukardaki örnekte :D )

x=-1/3(tek sayı)
3.-1/3=-1


Örnekler devam ettirilebilir. Çok var :D










Mathamatik prof ol sen kardes :D
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.