求整数N,加到其(十进制)反向,等于M

时间:2016-04-28 13:24:14

标签: algorithm math integer logic

设N是整数。如果N = 2536,则反转的N是6352.如果N = 1000000,则反转的N是1 给出整数M,其中1 <= M <= 10 ^(100000) 我们需要找出是否存在整数N,其中N +反转(N)= M.

除了暴力之外还有什么想法?

1 个答案:

答案 0 :(得分:5)

这里我将简要介绍一种算法。应该注意的是,需要填写许多细节。

基本想法是查看M的第一个和最后一个数字,以确定N的第一个和最后一个数字的总和,然后将此数量从M减去减少到数字较短的情况。

如果可以写成N + reverse(N),请拨打号码。

(编辑:在实施中,可能需要一个函数IsGood(M, k)来判断某些M是否N + reverse(N)可以写为N < 10^k。但是我们跳过这个细节目前。)

确定给定数字M是否良好的算法如下:

cd成为M的第一个和最后一个数字,让R成为中间部分。也就是说,M具有数字表达式cRd

有两种情况:

  • c不等于1
  • c等于1

如果c不等于1,则数字c不能为进位。这是正常情况。现在看d

如果d等于c,那么M是好的,当且仅当R是好的。

如果d等于c - 1,那么从Rc会有一个进位,因此M是好的,当且仅当1R 1}}在携带案例中很好(见下文)。

如果d等于其他任何内容,那么M就不行了。

c等于1的情况下,c还有可能是一个进位。

e成为R的第一个数字,并将M写为1eTd

如果d = 9e < d,则无法携带便携包。

(编辑:这是错误的,如果d = 9可以使用e = 0个案例。)

否则,当且仅当(e - d)(T - 1)好时,便携箱才有可能。

如果手提箱保持或正常情况保持,则M是好的。

示例:

让我们从M = 12001开始。

c = 1以来,有正常案例和便携包。

在正常情况下,我们有d = 1,因此我们需要测试200是否合适。对于M = 200,我们有c = 2d = 0,因此数字200不好,因此M = 12001的正常情况会失败。

在随身携带的情况下,我们需要测试(12001 - 11000 - 11) / 10 = 99是否良好。对于M = 99,我们有c = 9d = 9,因此这再次缩小为0是否良好,这显然是正确的。因此,随身携带的情况仍然存在。

结论是M是好的。

时间复杂度:

通过一些详细的参数(我不想在此提出),可以证明该算法在O(log_10(M))时间内运行。