Проект Эйлера # 4 с C #

Я пытаюсь решить проект euler # 4 с помощью С #, и, согласно предыдущим сообщениям, я не мог найти никакого решения этой проблемы с С #.

Вопрос в том:

Палиндромное число одинаково читается в обоих направлениях. Самый большой палиндром, составленный из двух двузначных чисел, равен 9009 = 91 99.

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

Ниже мой код, но когда я смотрю, как он работает, я не вижу своей ошибки. Как я могу это исправить?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_11_project_Euler_problem_4
{

class Program
{

    static void Main(string[] args)
    {
        int x, y;
        string product="" , res="";

        for (x = 100; x <= 999; x++)
        {
            for (y = 100; y <= 999; y++)
            {
                product = Convert.ToString(x*y);

                if (product == new String(product.Reverse().ToArray()))
                {
                    Console.WriteLine("X=" + x + " Y=" + y );
                    res = product;

                    Console.WriteLine("Polindrome is: " + res);
                }

                else { continue; }
            }
        }
    }
}
}

Результат, который нашел мой код, - 580085, вот скриншот моего вывода. Он отображает каждый номер палиндрома результата с его множителями.

введите описание изображения здесь

Хотя, согласно projecteuler.net, мой результат неверен. Один из моих выходов дал мне фактический результат. 906609. Это второй результат перед последним палиндромом моего кода. Я думаю, что я был неправ, думая, что увеличение множителей внутри вложенных циклов for, потому что оно было непреднамеренно основано на самом большом X, дает самую большую логику умножения. Чтобы предотвратить это, я собираюсь еще раз преобразовать свои res и product в целое число и всегда сохранять больший результат продукта в переменной product


person t1w    schedule 26.05.2013    source источник
comment
Просить людей выявлять ошибки в вашем коде не особенно продуктивно. Вы должны использовать отладчик (или добавить операторы печати), чтобы изолировать проблему, отслеживая прогресс вашей программы и сравнивая его с тем, что вы ожидаете. Как только они расходятся, значит, вы нашли свою проблему. (А затем, если необходимо, вы должны создать минимальный тестовый пример.)   -  person Oliver Charlesworth    schedule 26.05.2013
comment
Что ж, спасибо за добрую критику. На самом деле, сначала я разделил свой код на несколько методов, и все они работали хорошо, но когда я попытался объединить их вместе, у меня вообще не было выходов. конечно, я могу его пересмотреть, я также хорошо знаю sscce, но я думал, что моя проблема очевидна, поэтому код всего 2 вложенных цикла и некоторое время :) так что, если вы можете отменить голосование за флаг закрытия, я буду признателен   -  person t1w    schedule 26.05.2013
comment
Я понимаю, что ваш код выше короткий, но вы действительно должны уметь решать эту проблему с помощью стандартных методов отладки. Например, добавьте оператор печати в каждый из ваших циклов.   -  person Oliver Charlesworth    schedule 26.05.2013
comment
Ok. Я сделаю это в течение следующих 5 минут   -  person t1w    schedule 26.05.2013
comment
Итак, у вас есть код, красиво разделенный на небольшие функции и дающий правильный результат, чем вы решили собрать все вместе, и он перестал работать? Звучит как хороший совет для использования небольших, четко обозначенных, хорошо протестированных функций ... Примечание: существует множество сайтов с ответом на проект - если вы не хотите делать это самостоятельно, просто найдите и вставьте ответ.   -  person Alexei Levenkov    schedule 26.05.2013
comment
@AlexeiLevenkov Я думал, что они слишком малы, чтобы их можно было разделить, но, основываясь на этом опыте, я теперь вижу, что разделение сделать проще. Плюс ко всему я прекрасно осведомлен о том, что множество сайтов дает результат. Но зачем мне здесь заморачиваться, если нужен только результат ??   -  person t1w    schedule 26.05.2013


Ответы (2)


Потому что, обнаружив палиндром, вы навсегда зацикливаетесь внутри цикла while. Измените while на и if, и он должен работать.

РЕДАКТИРОВАТЬ:

Да, вам нужно будет отслеживать самый крупный найденный продукт, а не просто предполагать, что последний найденный продукт является самым большим.

person mclaassen    schedule 26.05.2013
comment
Привет, спасибо за ответ. Я изменил цикл while, как вы предложили. И добавил оператор else после if, который не содержит ничего, кроме continue; зарезервированное слово. Однако, согласно projecteuler.net, мой результат неверен. Вы можете мне намекнуть об этом? - person t1w; 26.05.2013
comment
Продолжение там по сути ничего не делает. Не уверен, почему ответ неверен. - person mclaassen; 26.05.2013
comment
@ TimurAykutYıldırım Подсказка: 995 * 583 = 580085. - person Daniel Fischer; 26.05.2013
comment
Это ответ, который я получаю, когда запускаю его. - person mclaassen; 26.05.2013
comment
Какой ответ ты получаешь? - person mclaassen; 26.05.2013
comment
Получаю то же самое, но 993 * 913 = 906609. Это второй результат перед последним палиндромом моего кода. Я думаю, что я был неправ, думая, что увеличение множителей внутри вложенных циклов for, потому что оно было непреднамеренно основано на самом большом X, дает самую большую логику умножения. Так и должно быть: оба множителя должны увеличиваться до тех пор, пока они могут. Чтобы предотвратить это, я собираюсь еще раз преобразовать мои res и product в целое число и всегда сохранять результат большего продукта в переменном product. Спасибо большое за помощь мой друг :) - person t1w; 26.05.2013

Я получал ту же ошибку и искал помощи, когда нашел этот пост. И скриншот вашей консоли помог мне решить эту проблему.

Как видите, официальный ответ печатается до вашего окончательного ответа. Обратите внимание, что в этом вопросе вам предлагается указать «самый большой» палиндром, которым оказывается 906609, а не 580085. Наша программа печатает последний, потому что он выполняется в соответствии с циклом for, а последний x, для которого работает проверка палиндрома, является значением, которое печатается.

Я решил это с помощью условия if (моя логика кода отличается, но я адаптировал ее к вашей):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_11_project_Euler_problem_4
{

class Program
{

    static void Main(string[] args)
    {
        int x, y;
        string product="" , res="";

        for (x = 100; x <= 999; x++)
        {
            for (y = 100; y <= 999; y++)
            {
                product = Convert.ToString(x*y);

                if (product == new String(product.Reverse().ToArray()))
                {
                    Console.WriteLine("X=" + x + " Y=" + y );

                    if(x*y>Convert.ToInt64(res))
                        res = product;
                        Console.WriteLine("Polindrome is: " + res);
                }

                else { continue; }
            }
        }
    }
}
}

Блок if проверяет, больше ли этот продукт, чем предыдущий, и, если да, печатает. Надеюсь это поможет!

P.S: У меня была очень запутанная логика, включающая списки и проверку каждой цифры и прочего. Ваша строковая логика выглядит очень элегантно! Спасибо!

person Guru    schedule 27.10.2015