程序员的算法趣题Q01: 回文十进制数

本文介绍了一道算法问题,涉及寻找既是十进制、二进制、八进制回文数的数字。通过暴力搜索和分析数的结构来优化搜索范围,最终给出Python代码实现。虽然找到前两个三重回文数,但代码效率较低,为进一步优化提供了挑战。
摘要由CSDN通过智能技术生成

1. 问题描述

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

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

2. 解题分析

        本题使用暴力搜索即可。

        但是通过分析数的结构可以合理地减少有效搜索范围。

        由于数的首位(最高位)的数字不能为0,因此要构成回文数,最低位的数字也不能为0。这个约束条件规则应用到十进制数就意味着该数不能被10整除,同理,该数也不能被8整除,也不能被2整除。

        

3. 代码和运行结果

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 19 08:55:36 2021

@author: chenxy
"""
import time
import random
    
class Solution:
    def palindrome(self, N: int) -> int:
        """
        :N:    The number of the smallest palindrome to be searched for
        :    
        :ret:  return the palindrome list
        """ 
        
        count = 0
        rslt  = []
        k = 11
        while (1):            
            if not (k%8==0 or k%10==0):
                if k%1001 == 0: # cannot use 'k%1000' as print condition!
                    print('k = {0}'.format(k))
                k_decstr = str(k)
                if k_decstr == k_decstr[::-1]: # aStr[::-1] return the reverse of the original one
                    k_binstr = bin(k)[2:]  # bin(k) will return '0bxxxx'
                    if k_binstr == k_binstr[::-1]:
                        k_octstr = oct(k)[2:]  # oct(k) will return '0oxxxx'
                        if k_octstr == k_octstr[::-1]:
                            rslt.append(k)
                            count += 1
                            print('Found: k = {0}, count = {1}'.format(k, count))
                            if count == N:
                                break
            k += 2 # Skip the even number
        
        return rslt

        以上代码比原题稍微延申了一点,改为寻找前N个三重回文数(即题目要求的十进制表示、二进制表示、八进制表示都是回文数)。测试运行结果如下:

if __name__ == '__main__':        
    
    sln = Solution()

    N    = 2
    t1 = time.monotonic()
    rslt = sln.palindrome(N)
    t2 = time.monotonic()    
    print('N = {0}, rslt = {1}, tCost = {2}'.format(N,rslt,(t2-t1)))  

        搜索前两个三重回文数,结果非常出乎意料!

        Found: k = 585, count = 1
        Found: k = 719848917, count = 2
        N = 2, rslt = [585, 719848917], tCost = 152.375

        第2个三重回文数竟然是一个如此大的数,而且耗时长达152.375! 以这个速度没有勇气再进一步搜索第3个三重回文数了。需要对以上代码进行进一步优化。

        下一篇:Q02: 四则运算组合游戏

        本系列总目录参见:程序员的算法趣题:详细分析和Python全解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨牛慢耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值