6

在 C++ 中,找到给定 15 位数字的下一个回文的最快逻辑是什么?例如: 134567329807541 的下一个回文将是什么?

4

5 回答 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

我相信是这样的

  1. 将数字分成三部分 1345673 2 9807541
  2. 翻转最后一个 1457089
  3. 如果它大于第一部分(在这种情况下)
    • 第一部分++
    • 中间部分 = 0
  4. 翻转第一部分并替换最后一部分。
于 2009-10-04T09:53:38.067 回答
1

我不打算实现任何东西,但我想逻辑是:

  1. 拆分字符串中间的数字:X 为左边部分,Y 为右边部分。
  2. 令 X' = { X + 1 if reverse(X) < Y; X 否则 }
  3. 然后结果是 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 回答