在 C++ 中,找到给定 15 位数字的下一个回文的最快逻辑是什么?例如: 134567329807541 的下一个回文将是什么?
问问题
3304 次
5 回答
16
将数字分成三部分,
head
,mid
,tail
1345673 2 9807541
反转
head
并与tail
3765431进行比较如果
reverse(head) <= tail
(如果它们相等,则初始输入是回文,并且您想要下一个)- 如果
mid < 9
, 增加中间 - 其他增量
head
部分和设置mid := 0
- 如果
结果 :=
head mid reverse(head)
。1345673 3 反向(1345673)=> 134567333765431
于 2009-10-04T10:11:18.637 回答
3
我相信是这样的
- 将数字分成三部分 1345673 2 9807541
- 翻转最后一个 1457089
- 如果它大于第一部分(在这种情况下)
- 第一部分++
- 中间部分 = 0
- 翻转第一部分并替换最后一部分。
于 2009-10-04T09:53:38.067 回答
1
我不打算实现任何东西,但我想逻辑是:
- 拆分字符串中间的数字:X 为左边部分,Y 为右边部分。
- 令 X' = { X + 1 if reverse(X) < Y; X 否则 }
- 然后结果是 concat(X',reverse(X'));
如果长度不均匀,则需要将中间数字分开处理。但这很微不足道。
于 2009-10-04T09:54:03.527 回答
0
我认为以下算法也应该有效..它也更容易实现
i) Divide the given nos into three parts HEAD MID TAIL
ii) Add 1 to number HEAD MID
(in case of carry, follow basic addition rules)
iii) reverse the new HEAD(store it in HEAD_REV)
iv) required ans is:- 'new HEAD' MID HEAD_REV
希望以下示例将有助于更好地理解算法
不要这样:- 23469 9 12367
So HEAD -> 23469 MID -> 9 TAIL --> 12367
step 2:- 23469 9 +1 = 23470 0
(now HEAD -> 23470 MID -> 0 HEAD_REV -> 07432 )
需要回答:-
23470 0 07432
如果此过程中存在任何缺陷,请告诉我
于 2013-06-14T06:29:13.260 回答
0
Split the number into three parts head, mid and tail
if reverse(head)>tail
result := head mid reverse(head)
else if reverse(head)= tail && mid<9
mid++
result := head mid tail
else
mid =0
head++
result := head mid reverse(head)
于 2014-02-01T06:58:39.353 回答