最大的回文产品 - C#

时间:2014-11-29 17:43:54

标签: c#

Hello其他程序员

我目前正在尝试解决C#中Project Euler的一些问题,以提高我的知识水平。 但是,我为Problem #4制定的一个解决方案即使应该也不起作用。

  

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。

     

找出由两个3位数字的乘积制成的最大回文。

有什么想法吗?

    namespace ProjectEuler_4
{
    class Program
    {
        static void Main(string[] args)
        {

            for (int i = 999; i >= 100; i--)
            {
                for (int j = 999; j >= 100; j--)
                {
                    if (isPalindome(i *j) == true)
                    {
                        Console.WriteLine("Digit1: " + i);
                        Console.WriteLine("Digit2: " + j);
                        Console.WriteLine("Outcome: " + i * j);
                          Console.ReadLine();
                    }
                    else
                    {

                        Console.WriteLine(i + " " + j + " =nope");

                    }
                }


            }
            Console.ReadLine();
        }
        public static bool isPalindome(int num)
        {
            string sNum = num.ToString();
            for (int i = 0; i < sNum.Length / 2; i++)
                if (sNum[i] != sNum[sNum.Length - 1 - i]) return false;

            return true;
        }

    }
}

结果是:

Digit1:995 数字2:583 总计:580085

虽然,这不是正确的答案。 我做错了什么? 我不是要求一个完成的解决方案,只是想了解这个问题是什么。

3 个答案:

答案 0 :(得分:2)

尝试检查所有组合。例如,994 * 994较大,你甚至没有检查它。

答案 1 :(得分:2)

您的程序确实有效并找到了正确的答案。但是,它不会首先打印最大数字,而是第三个输出。

例如,i = 999 j = 2在i = 998 j = 998之前出现,但第二个产品要大得多。请注意,您没有按降序查找产品。

好的解决方案是一个简单的最大查找循环(​​kinda-pseudo-code):

var best = -1;
for (i, j) {
  if (isPalindrome(i*j) && i*j > best) {
    best = i*j;
  }
}
Console.WriteLine(best);

答案 2 :(得分:0)

我有几点说明:

  • i启动内循环更好。
  • 如果找到回文,我们可以离开内循环,因为它保证当前i没有大于number的数字。
  • 搜索能够提供99..9 - 90..0范围内最大产品的被乘数是有意义的,因为它们肯定存在于此范围内。
  • 最快的条件应该是if声明中的第一个。
  • 我已使用long类型的变量来使下面的代码适用于更大的数字。

试试这段代码示例:

// Store the maximum palindrome number here:
long maxNumber = 0;

// The maximum multiplicand (typically: 9...9):
const int NMax = 999;
// The minimum multiplicand.
// Obviously, it couldn't be less than 90...0:
const int NMin = NMax - (NMax + 1) / 10 + 1;

for (int i = NMax; i > NMin; i--)
{
    // Starting from i since i * j = j * i for any i, j:
    for (int j = i; j > NMin; j--)
    {
        long number = Math.BigMul(i, j);
        // The fastest condition should be the first in the `if` statement:
        if (number > maxNumber && isPalindome(number))
        {
            maxNumber = number;
            Console.WriteLine("{0} = {1} * {2}", number, i, j);
            break; // Leave the `j` loop, because it's guaranteed that there is
                   // no numbers greater than `number` for the current `i`
        }
    }
}

输出:

for NMax=999:     906609 = 993 * 913
for NMax=9999:    99000099 = 9999 * 9901
for NMax=9999999: 99956644665999 = 9998017 * 9997647