原问题位于Project Euler biggest palindrom product,如下。
回文数的读法相同。由两个2位数的乘积组成的最大回文是9009 = 91 × 99。求两个3位数乘积的最大回文
上下文中的问题在最大的回文产品- c#。我得到了正确的答案,但从最小到最大,而不是从最大到最小,所以我寻找一个更有效的答案来学习。我明白所有的代码是做什么的,但我不知道德米特里是从哪里开始得到这个公式的,从最大乘数常数中得到最小乘数。我正在浏览几个编码挑战网站,为一些技术面试做准备。
这条线:
const int NMin = NMax - (NMax + 1) / 10 + 1;
// 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`
}
}
}
我浏览过的网站包括:
- 代码来临
- HackerEarth和HackerRank
- Leetcode我一直在努力完成综合学习计划
- 项目Euler现在只在问题#4上
如问题4所述,两位数乘积的最大回文是91*99
。我相信Dmitry认识到给定数字范围(他计算的3,4或5,但实际上是无穷大)的所有最大回文数必须是9x -> 9y
(其中x
代表0,y
代表9)。如果你总是希望是最大的回文,那么x
和y
的数量就是digit - 1
。这里较低的90%根本不值得检查回文,因为它们不会产生最高的乘法。
因此,他可以计算出每次给定他提供的方程的最小值:
NMin = NMax - (NMax + 1) / 10 + 1 // NMin = 900 if NMax = 999
对于4位回文,这将生成9,000 -> 9,999
或90,000 -> 99,999
。
这里需要注意的重要一点是可以硬编码NMin
或选择一个更大的最小值。