回文十进制数
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
}
}