C#:找到由3位数字的乘积制成的最大回文数

时间:2017-03-07 13:33:44

标签: c#

我正在编写一个程序来查找由3位数字的乘积组成的最大回文数。首先,我创建一个能够检查它是否是回文数的方法。这是我的代码:

static int check(string input_number)
{
    for (int i = 0; i < input_number.Length/2; i++)
        if (input_number[i] != input_number[input_number.Length - i])
            return 0;
    return 1;
}

之后,它是我的主要代码:

static void Main(string[] args)
{
    int k = 0;
    for (int i = 0; i < 999; i++)
        for (int j = 0; j < 999; j++)
        {
            k = i * j;
            if (check(k.ToString()) == 1)
                Console.Write(k + "      ");
        }
}

但是当问题是input_number的长度为零时。所以我的代码没有正确运行。我该怎么做才能解决input_number的长度?

2 个答案:

答案 0 :(得分:4)

您的代码中有一些错误:

1。 3位数字的范围从“100”到“999”,而不是“0”到“998”,就像你们的循环一样。

因此,您的Main方法应如下所示:

static void Main(string[] args)
{
    int k = 0;
    for (int i = 100; i <= 999; i++)
        for (int j = 100; j <= 999; j++)
        {
            k = i * j;
            if (check(k.ToString()) == 1)
                Console.Write(k + "      ");
        }
}

现在检查所有三位数字对。但是为了提高效果,您可以j开始i,因为您已经检查过,例如213 * 416并且不再需要检查416 * 213

for (int i = 100; i <= 999; i++)
    for (int j = i; j <= 999; j++) // start at i

既然你想找到最大的,你可能想从另一端开始:

for (int i = 999; i >= 100; i--)
    for (int j = 999; j >= 100; j--)

但仍然并不保证第一个结果将是最大的。您需要收集结果并对其进行排序。以下是我的Main

的LINQ建议
var results = from i in Enumerable.Range(100, 900)
                    from j in Enumerable.Range(i, 1000-i)
                    let k = i * j
                    where (check(k.ToString() == 1)
                    orderby k descending
                    select new {i, j, k};
var highestResult = results.FirstOrDefault();

if (highestResult == null)
    Console.WriteLine("There are no palindromes!");
else
    Console.WriteLine($"The highest palindrome is {highestResult.i} * {highestResult.j} = {highestResult.k}");

2。你的回文检查被打破了

您将索引i处的字符与input_number[input_number.Length - i]进行比较,这会为IndexOutOfRangeException提供i = 0。字符串是从零开始的索引,因此最后一个字符的索引是Length-1。所以将行改为

if (input_number[i] != input_number[input_number.Length - i - 1])

最后,我建议使用返回类型为check的{​​{1}}方法而不是bool

int

这对我来说似乎更自然。

答案 1 :(得分:2)

您可以使用以下方法。因为你试图找到从999开始的最大数字然后向后移动,所以进行乘法并检查它是否是回文。

private void FindProduct()
{
 var numbers = new List<int>();
 for (int i = 999; i > 99; i--)
 {
    for (int j = 999; j > 99; j--)
    {
        var product = i * j;
        var productString = product.ToString();
        var reversed = product.Reverse();
        if (product == reversed)
        {
               numbers.Add(product);
        }
     }
   }
   Console.WriteLine(numbers.Max());
}