【问题标题】:need algorithm to find the nth palindromic number需要算法来找到第 n 个回文数
【发布时间】:2013-02-22 08:27:31
【问题描述】:

考虑一下

    0 -- is the first
    1 -- is the second
    2 -- is the third
    .....
    9 -- is the 10th
    11 -- is the 11th

什么是找到第 n 个回文数的有效算法?

【问题讨论】:

  • @SingerOfTheFall 我可以找到一个算法来找到第n个k位回文数,例如我可以找到第113个8位回文数是11122111。
  • 使用该算法并在位数上添加迭代。
  • @Oswald,同意。但是 OP 也应该澄清他是否只需要一个算法,或者一个 快速 算法。
  • @Oswald 对不起,你能举个例子吗?
  • @SingerOfTheFall OP 确实说过“高效算法”。

标签: c++ algorithm palindrome


【解决方案1】:

我假设 0110 不是回文,因为它是 110。

我可以花很多话来描述,但这张表应该足够了:

#Digits #Pal. Notes
   0     1     "0" only
   1     9     x     with x = 1..9
   2     9     xx    with x = 1..9
   3    90     xyx   with xy = 10..99 (in other words: x = 1..9, y = 0..9)
   4    90     xyyx  with xy = 10..99
   5   900     xyzyx with xyz = 100..999
   6   900     and so on...

【讨论】:

  • 我想这很有用:) tyvm
【解决方案2】:

偶数位数的(非零)回文数从p(11) = 11, p(110) = 1001, p(1100) = 100'001,... 开始。它们是通过采用索引n - 10^L(其中L=floor(log10(n)))构造的,并附加此数字的反转:p(1101) = 101|101, p(1102) = 102|201, ..., p(1999) = 999|999, etc。对于索引n >= 1.1*10^L but n < 2*10^L,必须考虑这种情况。

n >= 2*10^L时,我们得到以p(2) = 1, p(20) = 101, p(200) = 10001 etc.开头的奇数位回文,并且可以以同样的方式构造,再次使用n - 10^L with L=floor(log10(n)),并附加该数字的反转,现在没有最后一位了p(21) = 11|1, p(22) = 12|1, ..., p(99) = 89|8, ...

n < 1.1*10^L 时,从 L 中减去 1 以在 n >= 2*10^L 的情况下为奇数位数的正确设置。

这产生了简单的算法:

p(n) = { L = logint(n,10);
         P = 10^(L - [1 < n < 1.1*10^L]); /* avoid exponent -1 for n=1 */
         n -= P; 
         RETURN( n * 10^L + reverse( n \ 10^[n >= P] ))
       }

如果 ... 为真,则 [...] 为 1,否则为 0,\ 为整数除法。 (表达式n \ 10^[...]等价于:if ... then n\10 else n。)

(我在指数中添加了条件 n > 1 以避免 n=0 时 P = 10^(-1)。如果使用整数类型,则不需要这个。另一个选择是放置 max(. ..,0) 作为 P 中的指数,或者在开始时使用if n=1 then return(0)。另外请注意,在分配 P 之后您不需要 L,因此您可以对两者使用相同的变量。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2017-02-02
    • 2016-02-01
    相关资源
    最近更新 更多