1684838553 / arithmeticQuestions

程序员的算法趣题
2 stars 0 forks source link

回文十进制数 #1

Open 1684838553 opened 2 years ago

1684838553 commented 2 years ago

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

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

1684838553 commented 2 years ago
function getFunction() {
    let num;
    for (let i = 11;; i++) {
        let binary = i.toString(2)
        let octal = i.toString(8)
        if (getPalindrome(i) && getPalindrome(binary) && getPalindrome(octal)) {
            num = i
            break;
        }
    }
    return num
}

function getPalindrome(number) {
    number = typeof number === 'string' ? number : String(number)
    return number === number.split('').reverse().join('')
}

console.log(getFunction())   // 585
1684838553 commented 2 years ago

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

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

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

1684838553 commented 2 years ago
/* 为字符串类型添加返回逆序字符串的方法 */
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;
}