`
zhex
  • 浏览: 25086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

求能分解为两个三位数乘积的最大回文数

阅读更多
注:所谓回文数就是正序和倒序相等的数字,好比9009的倒序还是9009

在题目中,我们已经知道了这个回文数是2个三位数的乘积, 那我们可以很轻松的写出代码。
#定义数字倒转函数
def	reverse(num):
    strnum = str(num)[::-1]
    return int(strnum)

max = None
for a in range(100, 1000):
    for b in range(100, 1000):
        rs = a * b
        if rs == reverse(rs) and rs > max:
            max = rs
print max


用这个方法我们是可以得到结果,但是效率好像不尽人意。 现在我们来分析下还可以怎么优化我们的程序:

1. 上述程序中,a和b的乘积会反复出现吗? 比如当a=132,b=528同a=528, b=132的结果是一样的,那我们通过设置b小于或大于a,是不是可以避免这样的情况。

2. 题目要求我们找的最大的乘积, 那2个三位数肯定也是很大, 我们用从大到小查询,是不是会比从小到大查询快很多呢,当我们找到的后一个回文数没有前一个大,那程序就可以终止了。

3. 两个三位数的乘积肯定是一个六位数, 而这个六位回文数数P我们可以用xyzzyx的形式表示,那我们可以得到下面的公式:
P = 100000x + 10000y + 1000z + 100z + 10y + x
P = 100001x + 10010y + 1100z
P = 11(9091x + 910y + 100z)
在这个公式中我们发现回文数是11的倍数,而11是质数,这也就表示不是a可以被11整除,就是b可以被11整除。那我们合理的利用11作为递进数是不是要比原来的1更效率呢?

通过上述分析,我们来重写代码:
#定义数字倒转函数
def	reverse(num):
    strnum = str(num)[::-1]
    return int(strnum)

max = None
for a in range(999, 99, -1):
    db = -1
    start = 999
    if a % 11 != 0:
        start = 990
        db = -11
    for b in range(start, 99, db):
        rs = a * b
        if rs == reverse(rs):
            if rs > max:
                max = rs
            else:
                break
print max


经测试,原来的程序需要810000次循环,而优化后的程序只需要71533次循环, 性能提高了10倍多。

分享到:
评论
1 楼 danielzhang0212 2011-01-08  
在euler project做题,不会了就搜到你的帖子了。分析的相当好,学习了!

相关推荐

    欧拉计划1-50题

    - **问题描述**:寻找两个三位数相乘得到的最大回文数(即正读反读都一样的数)。 - **算法思路**: - 使用双重循环,外层循环从最大的三位数开始递减至最小的三位数。 - 内层循环也从最大的三位数开始递减。 - ...

    欧拉计划.doc

    解决方法是通过两重嵌套循环,从999到100依次尝试每一对三位数的乘积,检查是否为回文数,并记录最大的一个。 **关键概念**: - **回文检测**:将数转换为字符串,比较正序和倒序是否相同。 - **乘积迭代**:使用两...

    java50个编程题[文].pdf

    3. 打印水仙花数:三位数的每一位数的立方和等于该数本身。通过循环遍历100到999,分解出每位数并计算立方和。 4. 分解质因数:对于正整数n,分解出所有质因数。常用方法是从2开始尝试除法,直到n不能被当前质数...

    期末复习JAVA题.docx

    在Java编程语言中,这些题目涉及了多个基本概念和算法,包括分解质因数、判断回文数、数组操作、水仙花数、素数检测、最大公约数和最小公倍数,以及寻找完数。下面我们将逐一解析这些知识点。 1. **分解质因数**: ...

    26道基础算法题.pdf

    **问题描述**:判断一个5位数是否为回文数。 **解题思路**: - 将数字转换为字符串。 - 检查字符串首尾是否相同,逐步向中间移动。 ### 20. 星期判断 **问题描述**:输入星期几的第一个字母来判断星期几。 **...

    2014最新Java编程题

    **问题描述**:判断一个5位数是否为回文数,即正读反读都一样。 **解决方案**:将数字转换为字符串,比较字符串与其反转后的字符串是否相等。 这些编程题涵盖了基本的数据结构、算法、数学概念以及逻辑处理能力,...

    Java基础习题[文].pdf

    6. **最大公约数和最小公倍数**:辗转相除法(欧几里得算法)可用于计算两个数的最大公约数,最小公倍数可以通过两数乘积除以最大公约数得到。 7. **字符统计**:使用循环和条件判断,读取一行字符,统计字母、空格...

    java算法练习题 大家下载看看啦

    - **描述**:水仙花数是指一个三位数,它的每个位上的数字的立方和等于它本身。 - **实现思路**: - 使用`for`循环遍历100到999之间的所有数字。 - 对于每一个数字,分别提取出百位、十位和个位上的数字。 - 计算...

    100道Python练手题目1

    7. 回文数:判断一个数是否为回文数,涉及字符串操作和循环。 8. 递归求阶乘:通过递归函数计算阶乘,理解递归的基本原理。 9. 递归输出:使用递归实现特定序列的输出,如斐波那契数列的递归输出。 10. 反向输出:...

    java小练习,Java练习小程序,Java必用

    - 水仙花数定义:一个三位数,其各位数字的立方和等于该数本身。 - 示例:153 = 1^3 + 5^3 + 3^3。 - 通过循环遍历100到999之间的所有数字,并判断是否为水仙花数。 4. **质因数分解**: - 给定一个正整数,将...

    java基础编程题

    25. **回文判断**:判断一个数是否为回文数。 26. **链表操作**:操作链表数据结构。 27. **素数检测**:检查一个数是否为素数。 28. **数字游戏**:解决基于数字的游戏问题。 29. **选择排序**:实现选择排序算法。...

    java入门题目

    - **描述**:判断一个数是否为回文数。 - **解析**:将数字转换为字符串,然后比较字符串与其反转后的字符串是否相同。 #### 题目二十六:数组操作 - **描述**:在数组中查找特定元素的位置。 - **解析**:使用...

    拆分数字(java代码).docx

    ### 拆分数字(Java代码)知识点解析 #### 一、概述 本文将详细介绍一个使用Java语言编写的程序,该程序的主要功能是...此外,通过调整`splitNumber`方法的逻辑,还可以扩展更多的功能,比如判断数字是否为回文数等。

    2010第一届全国软件大赛决赛试题-Java

    具体实现上,可以使用双重循环分别枚举两个两位数的乘积,再判断结果是否符合条件(即结果只包含1、3、5、7、9)。对于每个符合条件的组合,将其按照指定格式输出即可。 ### 4. 直角三角形斜边长度计算 #### 题目...

    (完整word)C语言程序设计100个经典例子.doc

    16. **正整数求其最大公约数和最小公倍数**:欧几里得算法可以用来找到两个数的最大公约数,最小公倍数则可以通过两者相乘除以最大公约数得到。 17. **统计英文字母/空格/数字个数**:遍历字符串,计数不同字符类型...

    100个经典例题(C语言).doc

    - **描述**:检查一个五位数是否为回文数。 #### 【程序31】输入星期几的第一个字母来判断一下是星期几 - **知识点**: - 字符比较 - 条件判断 - **描述**:根据用户输入的星期几的第一个字母来判断并输出完整的...

    Java编程经典练习题[附带解题思路

    - **题目描述**:判断一个五位数是否为回文数。 - **解题思路**: - 分别提取五位数的首位和末位,并比较它们是否相等。 - 重复这个过程直到所有的位都比较完毕。 #### 26. 字符串比较 - **题目描述**:比较两个...

    数字推理最新题库详解

    解答:相邻两数差为8、13、21,新数列从第三项开始,后数为前两数之和,所以新数列最后一数为34,答案是55+34=89。答案是:B、89。 18. 题目:1,1,3/2,2/3,5/4,() 解答:选A,具体解法未给出。 19. 题目:1...

Global site tag (gtag.js) - Google Analytics