Şimdi Ara

C# Palindromik Sayı Problemi Hakkında

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir (1 Mobil) - 2 Masaüstü1 Mobil
5 sn
12
Cevap
0
Favori
880
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar. Bilenler bilir, Project Euler'deki 4. problemi çözerken takıldım.

    Sorun şu kodları yazdım ama programı açınca programda butona basar basmaz program kilitleniyor. (Bu arada konsol değil, form üzerinden çalışıyorum.)

    Ayrıca bir şey daha var ben problemi uzun yoldan çözmek istiyorum, kısa yoldan çözebiliyorum. Yani for döngülerindeki i ve j'yi 100'den arttırarak yapmak uzun yöntem, 999'dan azaltarak yapmak kısa yöntem. Ben ilk söylediğim gibi uzun yoldan çözmek istiyorum. Ve saatlerdir düşünüyorum hatamı bulamadım, yardımcı olursanız sevinirim.

    Önce problemi sonra kodları aşağıya atıyorum;

    Problem: 3 haneli iki sayıdan oluşturulabilecek en büyük palindromik sayıyı bulunuz.

    Kodlarım ((NOT: Formda hesaplamak üzere 1 buton ve sonucu gösteren label1 mevcuttur.)):

     
    private void button1_Click(object sender, EventArgs e)
    {
    int sayi = 0;
    int palindromikSayi=0;

    string ifade=sayi.ToString();
    string tersi="";

    for (int i = 100; i < 1000; i++)
    {
    for (int j = 100; j < 1000; j++)
    {
    sayi = i * j;

    for (int k = ifade.Length - 1; k >= 0; k--)
    {
    tersi = tersi + ifade[k];

    }
    if (tersi == ifade)
    {
    palindromikSayi = Convert.ToInt32(ifade);
    }
    else
    {
    ;
    }
    }
    }

    label1.Text = palindromikSayi.ToString();
    }



    < Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 1 Eylül 2016; 19:43:50 >







  •  

    void Button3Click(object sender, EventArgs e)
    {


    string ters="";
    char[] charArray;
    List<int> list = new List<int>();
    int sayi=0;
    for (int i = 100; i < 1000; i++)
    {


    for (int j = 100; j < 1000; j++)
    {
    sayi = i * j;
    charArray = sayi.ToString().ToCharArray();
    Array.Reverse( charArray );
    ters = new string(charArray);
    if (ters == sayi.ToString())
    {
    list.Add(sayi);
    }


    }

    }
    label1.Text=list.Max().ToString();

    }

  • Gökşen PASLI G kullanıcısına yanıt
    Birazcık mantığını açıklayabilir misiniz acaba direkt hazır kod ile anlayamıyorum.
  • senin yazdığını toparladım forlar biliniyor zaten sayı = ixj biliniyor

    chararray da sayıyı metne çevirip onu da harf harf arraya attık sonra tersine çevirdik hazır fonksiyonla sonra onu ters isimli değişkene string olarak atadık
    sonra sayı ile tersini ifle kıyasladık eşitse list e attık

    en son işlemler bitince listin en büyük sayısını labela yazdırdık
  • quote:

    Orijinalden alıntı: Gökşen PASLI

    senin yazdığını toparladım forlar biliniyor zaten sayı = ixj biliniyor

    chararray da sayıyı metne çevirip onu da harf harf arraya attık sonra tersine çevirdik hazır fonksiyonla sonra onu ters isimli değişkene string olarak atadık
    sonra sayı ile tersini ifle kıyasladık eşitse list e attık

    en son işlemler bitince listin en büyük sayısını labela yazdırdık

    Peki tersini alma işleminde chararray yerine direk string tanımlayıp benim yaptığım gibi yapamaz mıyız? Yani şundan bahsediyorum;

    for (int k = ifade.Length - 1; k >= 0; k--)
    {
    tersi = tersi + ifade[k];

    }

    Burada tersi, string bir ifade.
  • yaparsın
  • quote:

    Orijinalden alıntı: Gökşen PASLI

    yaparsın

    Peki o halde benim kendi yazdığım koddaki hata nedir? Program çalışıyor ama butona basınca kilitleniyor. Size zahmet olmazsa rica etsem benim şu alttaki kodumdaki hatalar nelerdir acaba?

     
    private void button1_Click(object sender, EventArgs e)
    {
    int sayi = 0;
    int palindromikSayi=0;

    string ifade = "";
    string tersi="";

    for (int i = 100; i < 1000; i++)
    {
    for (int j = 100; j < 1000; j++)
    {
    sayi = i * j;
    ifade = sayi.ToString();

    for (int k = ifade.Length - 1; k >= 0; k--)
    {
    tersi = tersi + ifade[k];

    }
    if (tersi == ifade)
    {
    palindromikSayi = int.Parse(ifade);
    }
    }
    }
    label1.Text = palindromikSayi.ToString();
    }




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • string tersi=""; yi üstten al
    sayı ixj üzerine taşı

    gerçi bu bir önceki sayıyı buluyor haliyle if bitiyor



    < Bu mesaj bu kişi tarafından değiştirildi Gökşen PASLI -- 1 Eylül 2016; 21:49:46 >
  • quote:

    Orijinalden alıntı: Gökşen PASLI

    string tersi=""; yi üstten al
    sayı ixj üzerine taşı

    gerçi bu bir önceki sayıyı buluyor haliyle if bitiyor

    Hocam çok teşekkür ederim. Allah sizden razı olsun sonunda çözdüm problemi, altı üstü 1 satırın yerini değiştirmek gerekiyormuş. Ama şunu da belirtmek istiyorum o string'in for içinde olmasının gerekliliği nedir, global olarak tanımlayınca neden olmuyor bunu da merak ettim açıkçası.

    Ayrıca programda ufak bir sorun daha çıktı o da sonuç olarak 906609 yerine 580058 değerini veriyordu bu da 583x995 demektir. Ama aradığımız değer 913*993'tü, 995>993 olduğu için bu hatayı veriyordu. Ama forumda bunla ilgili daha önce konu açılmış onu fark ettim oradan yararlanarak çözdüm o problemi de. (https://forum.donanimhaber.com/m_88901388/tm.htm )



    < Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 1 Eylül 2016; 22:28:52 >




  • Breakpoint koy anlarsın sıkıntıyı 6 7 nci denemede string gitgide büyüyor

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • İlk mesajda sayi = i * j altında ifade = sayı.ToString() gibi bir satır olması gerek ancak yok, yapılmaması gereken bir copy paste hatası

    tersi değişkeni global olabilir, sadece k döngüsü içinde kontrol yapılacağı için "" ile sıfırlamak gerekli. yani string tersi = "" ifadesi olduğu yerde kalıp k döngüsünden önce tersi="" demen kâfi. bu değişiklik sonrası k döngüsü sonrası if bloğunu sonundaki else kısmını kaldırıp k döngüsü içine alırsan kod rahatlar ve muhtemelen daha hızlı çalışır.

    Gökşen'in çözüm ise güzel görünmekle birlikte tüm palindrom rakamları bir int listesinde tutuyor. Aynı sorunun 3 basamak değil de 100 veya daha yüksek sayıda basamaklı sayılar için sorulduğunu varsayalım, heap bellek şişmeye ve heap şiştikçe muhtemelen CPU da zorlanmaya başlardı. Ancak RAM ve CPU hiç zorlanmasaydı dahi rakamları listeye eklemek gereksiz.




  • Sözkonusu problemi Common Lisp ile çözdüm, aşağıda kodlar ve verdiği sonuç ekranı görülüyor. Daha altta kodlara yorum eklenmiş hali.

    Common Lisp başlangıçta karışık gelir fakat özellikle bu tür problemler çözerken gayet kullanışlı bir dildir.
     C# Palindromik Sayı Problemi Hakkında
     C# Palindromik Sayı Problemi Hakkında




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.