5 Mart 2015 Perşembe

10.000'in altında kaç Lychrel sayısı olduğunu hesaplama

Eğer 47 sayısını alır ters çevirir ve toplarsak 47+74 = 121 sayısını elde ederiz ki bu sayı palindromik bir sayıdır(sağdan ve soldan yazıldığında aynı). Fakat her sayı bu kadar kolay palindrom üretmez. Örneğin: 349 + 943 = 1292 1292 + 2921 = 4213 4213 + 3124 = 7337 349 sayısının palindrome olması 3 öteleme gerektirdi. Bazı sayılar, henüz kimse kanıtlamadı, asla palindrom sayı üretmezler, 196 gibi. Bu sayılara Lychrel sayıları denir. Biz burada kanıtlanmadığı için en fazla 50 ötelemeye kadar olup olmadığına bakacağız. Eğer 50 ötelemeye kadar bir palindrom üretmediyse Lychrel sayısıdır diyeceğiz. Fakat 50 ötelemenin sonrasında da palindrome olan sayılar var, misal 4668731596684224866951378664 (53 öteleme, 28 basamaklı). Soru: 10.000'in altında kaç Lychrel sayısı vardır?

UYGULAMAYI İNDİR




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form6 : Form
    {
        public Form6()
        {
            InitializeComponent();
        }

        private void Form6_Load(object sender, EventArgs e)
        {
            long MAX_NUMBER = 10000;
            long Counter = 0;
            long sum = 0;
            int iteration = 50;
            long j, i;
            for (i = 0; i < MAX_NUMBER; ++i)
            {
                sum = i;
                bool notpalindrome = true;
                for (j = 0; j < iteration; ++j)
                {
                    sum = sum + reverse(sum);
                    if (isPalindrome(sum))
                    {
                        notpalindrome = false;
                        break;
                    }
                }

                if (notpalindrome)
                {
                    Counter++;
                    listBox1.Items.Add(i);
                }
            
            }

            this.Text = Counter.ToString();
        }


        private static long reverse(long number)
        {
            long remainder;
            long reversed = 0;
            while (number != 0)
            {
                remainder = number % 10;
                reversed = reversed * 10 + remainder;
                number /= 10;
            }
            return reversed;
        }

        private static bool isPalindrome(long number)
        {
            if (number == reverse(number))
                return true;
            return false;
        }

    }
}

   




UYGULAMAYI İNDİR