谁能解释一下德米特里是怎么把NMin的数学弄下来的?



原问题位于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)。如果你总是希望是最大的回文,那么xy的数量就是digit - 1。这里较低的90%根本不值得检查回文,因为它们不会产生最高的乘法。

因此,他可以计算出每次给定他提供的方程的最小值:

NMin = NMax - (NMax + 1) / 10 + 1 // NMin = 900 if NMax = 999

对于4位回文,这将生成9,000 -> 9,99990,000 -> 99,999

这里需要注意的重要一点是可以硬编码NMin或选择一个更大的最小值。

相关内容

最新更新