【问题标题】:if given a 15 digit number whats the best way to find the next palindrome?如果给定一个 15 位数字,找到下一个回文的最佳方法是什么?
【发布时间】:2009-10-04 09:43:34
【问题描述】:

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

【问题讨论】:

  • +1 个非常有趣的问题,IMO
  • “x 的下一个回文”是什么意思?
  • 回文是前后读相同的东西(正如你希望从 Monty Python 的鹦鹉草图中知道的那样!),所以我猜“x 的下一个回文”是第一个数字 >= x 以 10 为底,前后读取相同。
  • 你已经得到了很多答案。我只想指出,因为它有一个C++ 标签,std::string(你应该使用它)有很多成员函数来操作它的内容。不幸的是,由于历史原因,它们中的一些使用索引,一些使用迭代器,许多(但不是全部)都有两者的版本,许多(但不是全部)在 <algorithm> 标头中有替代算法。就地反转提供随机访问迭代器的序列的好方法是使用std::reverse(),比较两个任意序列的好方法是std::equal()
  • 我想知道:'next' 是否意味着如果你已经有回文,你应该得到下面的回文,或者你对它满意吗?

标签: c++ algorithm palindrome


【解决方案1】:
  • 将数字分成三部分,headmidtail

    1345673 2 9807541

  • 反转 head 并将其与 tail 进行比较 3765431

  • 如果reverse(head) <= tail(如果它们相等,则初始输入是回文,并且您想要下一个)

    • 如果mid < 9,则增加mid
    • 其他增量head 部分和设置mid := 0
  • 结果 := head mid reverse(head).

    1345673 3 反向(1345673) => 134567333765431

【讨论】:

  • 如果 reverse(head)>tail 怎么办??
  • 留作练习:-)
  • if reverse(head)>tail 你继续“result:=...”
  • 如果你有偶数位数怎么办?
  • @CosminVacaroiu 15 不是偶数。
【解决方案2】:

我相信是这样的

  1. 将数字分成三部分 1345673 2 9807541
  2. 翻转最后一个 1457089
  3. 如果它比第一部分大(在这种情况下)
    • 第一部分++
    • 中间部分 = 0
  4. 翻转第一部分并替换最后一部分。

【讨论】:

  • 这和我想的一样,所以+1。
  • 这里有一个小错误,我认为......例如,看看输入“13 5 09”会发生什么(为方便起见,使用五位数字)。下一个回文是“13 5 31”,但算法给出的是“14 0 41”。要解决这个问题,步骤 2 应该是:翻转 first 部分,步骤 3 应该是:如果它小于 last 部分。
  • 另一个需要考虑的极端情况是输入是否是最后 15 位回文数(“999999999999999”)。
  • 有很多错误,我怀疑你的算法是否有用。 1.翻转first部分,作为最后一部分使用。如果结果大于原始数字,你就不用了。 2.如果它更小,增加middle部分。 3.如果中间部分是9(现在是10),将其设为0并增加第一部分。
  • 哦,我忘了:在最后一种情况下,翻转增加的第一部分并将其用作新的最后一部分。
【解决方案3】:

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

  1. 在字符串中间拆分数字:X 为左侧,Y 为右侧。
  2. 让 X' = { X + 1 if reverse(X)
  3. 然后结果就是 concat(X',reverse(X'));

如果长度不均,需要分开处理中间数字。但这很微不足道。

【讨论】:

    【解决方案4】:

    我认为以下算法也应该有效.. 也更容易实现

      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

    如果此过程中存在任何缺陷,请告诉我

    【讨论】:

    • 是的,有缺陷!!例如:- 34512 头- 34 中- 5 尾- 12 你的答案 35553 但一个较小的回文和正确答案 34543!!
    • 正确的算法应该是,计算头部中间和尾部... if head>tail answer- head mid reverse-head if head
    【解决方案5】:
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2018-11-25
      相关资源
      最近更新 更多