我正在编写一个程序来查找由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
的长度?
答案 0 :(得分:4)
您的代码中有一些错误:
因此,您的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
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}");
您将索引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());
}