设N是整数。如果N = 2536,则反转的N是6352.如果N = 1000000,则反转的N是1 给出整数M,其中1 <= M <= 10 ^(100000) 我们需要找出是否存在整数N,其中N +反转(N)= M.
除了暴力之外还有什么想法?
答案 0 :(得分:5)
这里我将简要介绍一种算法。应该注意的是,需要填写许多细节。
基本想法是查看M
的第一个和最后一个数字,以确定N
的第一个和最后一个数字的总和,然后将此数量从M
减去减少到数字较短的情况。
如果可以写成N + reverse(N)
,请拨打好号码。
(编辑:在实施中,可能需要一个函数IsGood(M, k)
来判断某些M
是否N + reverse(N)
可以写为N < 10^k
。但是我们跳过这个细节目前。)
确定给定数字M
是否良好的算法如下:
让c
和d
成为M
的第一个和最后一个数字,让R
成为中间部分。也就是说,M
具有数字表达式cRd
。
有两种情况:
c
不等于1
c
等于1
如果c
不等于1
,则数字c
不能为进位。这是正常情况。现在看d
。
如果d
等于c
,那么M
是好的,当且仅当R
是好的。
如果d
等于c - 1
,那么从R
到c
会有一个进位,因此M
是好的,当且仅当1R
1}}在携带案例中很好(见下文)。
如果d
等于其他任何内容,那么M
就不行了。
在c
等于1
的情况下,c
还有可能是一个进位。
让e
成为R
的第一个数字,并将M
写为1eTd
。
如果d = 9
或e < d
,则无法携带便携包。
(编辑:这是错误的,如果d = 9
可以使用e = 0
个案例。)
否则,当且仅当(e - d)(T - 1)
好时,便携箱才有可能。
如果手提箱保持或正常情况保持,则M
是好的。
示例:
让我们从M = 12001
开始。
自c = 1
以来,有正常案例和便携包。
在正常情况下,我们有d = 1
,因此我们需要测试200
是否合适。对于M = 200
,我们有c = 2
和d = 0
,因此数字200
不好,因此M = 12001
的正常情况会失败。
在随身携带的情况下,我们需要测试(12001 - 11000 - 11) / 10 = 99
是否良好。对于M = 99
,我们有c = 9
和d = 9
,因此这再次缩小为0
是否良好,这显然是正确的。因此,随身携带的情况仍然存在。
结论是M
是好的。
时间复杂度:
通过一些详细的参数(我不想在此提出),可以证明该算法在O(log_10(M))
时间内运行。