Q 01 回文十进制数

Q 01 回文十进制数

IQ:70 目标时间:10 分钟

如果把某个数的各个数字按相反的顺序排列,得到的数和原来的数相同,则这个数就是“回文数”。譬如 123454321 就是一个回文数。

表 1 十进制数、二进制数和八进制数示例

十进制数

二进制数

八进制数

0

0

0

1

1

1

2

10

2

3

11

3

4

100

4

5

101

5

6

110

6

7

111

7

8

1000

10

9

1001

11

10

1010

12

11

1011

13

12

1100

14

13

1101

15

14

1110

16

15

1111

17

16

10000

20

问题

求用十进制、二进制、八进制表示都是回文数的所有数字中,大于十进制数 10 的最小值。

例)

※ 本例中的十进制数 9 小于 10,因此不符合要求。

{%}

思路

因为是二进制的回文数,所以如果最低位是 0,那么相应地最高位也是 0。但是,以 0 开头肯定是不恰当的,由此可知最低位为 1。

如果用二进制表示时最低位为 1,那这个数一定是奇数,因此只考虑奇数的情况就可以。接下来可以简单地编写程序,从 10 的下一个数字 11 开始,按顺序搜索。譬如用 Ruby 就可以通过下面的代码找到符合条件的数(代码清单 01.01)。

代码清单 01.01q01_01.rb

# 从11 开始搜索
num = 11
while true
  if num.to_s == num.to_s.reverse &&
     num.to_s(8) == num.to_s(8).reverse &&
     num.to_s(2) == num.to_s(2).reverse
    puts num
    break
  end
  # 只搜索奇数,每次加2
  num += 2
end

{%}

下面试着用 JavaScript 实现同样的逻辑。JavaScript 里没有内置把字符串逆序的标准函数,因此首先需要封装一个返回逆序字符串的方法,其他流程则和代码清单 01.01 中的一致。JavaScript 版本的实现如代码清单 01.02 所示。

代码清单 01.02q01_02.js

/* 为字符串类型添加返回逆序字符串的方法 */
String.prototype.reverse = function (){
  return this.split("").reverse().join("");
}

/* 从11 开始搜索 */
var num = 11;
while (true){
  if ((num.toString() == num.toString().reverse()) &&
      (num.toString(8) == num.toString(8).reverse()) &&
      (num.toString(2) == num.toString(2).reverse())){
    console.log(num);
    break;
  }
  /* 只搜索奇数,每次加2 */
  num += 2;
}

{%}

Point

很多语言都提供了把整数转换成二进制数或者八进制数的方法。表 2 汇总了代表性语言的相关函数或者方法,不过 C 语言并没有提供直接转换的接口。

表 2 各编程语言中进制转换的接口

语言

二进制数

八进制数

十六进制数

Ruby

to_s(2)

to_s(8)

to_s(16)

PHP

decbin

decoct

dechex

Python

bin

oct

hex

JavaScript

toString(2)

toString(8)

toString(16)

Java

toBinaryString

toOctalString

toHexString

C#

Convert.ToString

Convert.ToString

Convert.ToString 或者 ToString("X")

{%}

答案

目录