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