Skip to content

03.10.2011

2

Задача №4 – projecteuler.net

Число-палиндром с обеих сторон (справа и слева) читается одинаково. Самое большое число-палиндром, полученное произведением двух двухзначных чисел – 9009 = 91 × 99.

Найдите самый большой палиндром, полученный произведением двух трёхзначных чисел.


Я разочарован. Если 3 задачу я решал больше 2 дней, то эта поддалась за 15 минут (правда, все же со 2 попытки). Вот все бы так)
Попытка №1:

        static int ObratChislo(int n)
        {
            int obr = 0;
            while (n > 0)
            {
                obr = 10 * obr + n % 10;
                n /= 10;
            }
            return obr;
        }
        static void Main(string[] args)
        {
            int otv = 0;
            for (int i = 999; i > 1; --i)
            {
                for (int j = 999; j > 1; --j)
                {
                    otv = i * j;
                    if (otv == ObratChislo(otv))
                    {
                        break;
                    }
                    else otv = 0;
                }
                if (otv != 0) break;
            }
            Console.WriteLine(otv);
            Console.ReadKey();
        }

Запускаю. Знакомое черное окошко, а в нем заветный палиндром — 90909. «Ура! задача решена». Ввожу на сайте ответ — неправильный. «Как? Палиндром? — Палиндром! Умножение трехзначных! Я крутой прогер, я не могу ошибаться», вспоминаю 3 задачу, самооценка резко падает и можно продолжать решать задачу =).

        static int ObratChislo(int n) //метод для получения "обратного" числа - для 1234 вернет 4321
        {
            int obr = 0;
            while (n > 0)
            {
                obr = 10 * obr + n % 10;
                n /= 10;
            }
            return obr;
        }
        static void Main(string[] args)
        {
            int otv = 0;
            int[] m = new int[999 * 999]; //в этом массиве будут все палиндромы
            int u = 0;
            for (int i = 999; i > 1; --i)
            {
                for (int j = 999; j > 1; --j)
                {
                    otv = i * j; // то самое произведения
                    if (otv == ObratChislo(otv)) // проверяем на "палиндромность"
                    {
                        m[u] = otv; //пишем в массив
                        ++u;        //увеличиваем индекс массива
                        break;      //завершаем цикл
                    }
                }
            }
            otv = m[0];   //ищем макс. элемент массива
            for (int i = 1; i < m.Length; ++i)
            {
                if (m[i]> otv) otv = m[i];
            }
            Console.WriteLine(otv);
            Console.ReadKey();
        }

Со 2 раза программа выдала правильный ответ. Заодно одно из д\з решил) Да, пока постил пришла умная мысль — в цикле можно проходить не до «1″ а до «100″.

2 Comments Post a comment
  1. Arthur
    Окт 10 2011

    class Program
    {
    static int max;
    static void Main(string[] args)
    {
    int mult;
    string smult;
    for (int i = 100; i <= 999; i++)
    {
    for (int j = 100; j <= 999; j++)
    {
    int c = 0;
    mult = i * j;
    smult = Convert.ToString(mult);
    for (int a = 0; a < smult.Length/2; a++)
    {
    if (smult[0 + a] == smult[smult.Length - 1 - a]) { c++; }
    if ((c == 3)&&( max<mult )) { max = mult; }
    }
    }
    }
    Console.WriteLine(max);
    Console.ReadKey();
    }
    }

    Ответить
  2. katja
    Окт 29 2012

    у меня 906609 получилось

    Ответить

Share your thoughts, post a comment.

(required)
(required)

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments