跳转至

回文十进制数

Tip

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

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

思路

因为是二进制的回文数,所以如果最低位是 0,那么相应地最高位也是 0。但是,以 0 开头肯定是不恰当的,由此可知最低位为 1。如果用二进制表示时最低位为 1,那这个数一定是奇数,因此只考虑奇数的情况就可以。接下来可以简单地编写程序,从 10 的下一个数字 11 开始,按顺序搜索。譬如用 Ruby 就可以通过下面的代码找到符合条件的数。

示例代码

is_palindrome_test.go
package golang

import (
    "strconv"
    "testing"
)

func reverse(s string) string {
    // 将字符串转换为rune切片(处理多字节字符)
    runes := []rune(s)
    // 双指针法翻转rune切片
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

func isPalindrome(num int64) bool {
    binary := strconv.FormatInt(num, 2)
    if reverse(binary) != binary {
        return false
    }

    octal := strconv.FormatInt(num, 8)
    if reverse(octal) != octal {
        return false
    }

    decimal := strconv.FormatInt(num, 10)
    if reverse(decimal) != decimal {
        return false
    }

    return true
}

func TestIsPalindrome(t *testing.T) {
    num := int64(11)

    for {
        if isPalindrome(num) {
            t.Logf("num: %v is palindrome", num)
            t.Logf("binary: %v", strconv.FormatInt(num, 2))
            t.Logf("octal: %v", strconv.FormatInt(num, 8))
            t.Logf("decimal: %v", strconv.FormatInt(num, 10))
            break
        }

        num += 2
    }
}

评论