python - 找到最大回文数的最快算法,它是具有相同位数的 2 个数字的乘积
问题描述
如何让这段代码在 30 秒内运行,以找到最大的回文数,它是 2 个具有相同位数的数字的乘积?
def palindrome(maxInt):
pa=[]
for x in range(maxInt,0,-1):
for y in range(maxInt,0,-1):
num=x*y
if str(num) == str(num)[::-1]:
pa.append(num)
return max(pa)
maxInt
是具有指定位数的最大数。例如,如果您想要一个是 2 个 3 位数字的倍数的回文数,您maxInt
将是 999。如果您想要一个是 2 个 4 位数字的倍数的最大回文数,则为maxInt
9999。等等。
如果maxInt = 9
,它应该输出 9。
如果maxInt = 99
,它应该输出 9009。
所以如果maxInt = 999
,程序应该输出 906609。
如何让它在 30 岁以下返回maxInt=9999
99000099
解决方案
- 如果你修复它会变得更快
x>=y
,所以不会单独测试和99*91
发现91*99
- 当找到回文时,内部循环可以退出(当它向下计数时,它可能找到的所有回文
x
肯定小于“当前”回文) - 如果当前乘积小于当前最大值,内层循环也可以退出
- 如果
x*x
小于当前最大值,外循环也可以退出
def palindrome(maxInt):
maxpal=0
for x in range(maxInt,0,-1):
if x*x<maxpal: # 4.
break
for y in range(x,0,-1): # 1.
num=x*y
if num<maxpal: # 3.
break
if str(num) == str(num)[::-1]:
maxpal=num
break # 2.
return maxpal
(当然3.
可能在范围内,for y in range(x,maxpal//x,-1):
也许)
- 严格来说,它应该只检查
y
-s 具有与 相同的位数x
,这还没有解决,但是**
向下舍入log10()
毕竟可以做到这一点。
我当前的完整代码:
import math,time
def palindrome(maxInt):
maxpal=0
for x in range(maxInt,0,-1):
if x*x<maxpal: # 4.
break
for y in range(x,max(maxpal//x,10**int(math.log10(x))-1),-1): # 1. 3. 5.
num=x*y
if str(num) == str(num)[::-1]:
maxpal=num
break # 2.
return maxpal
start=time.time()
print(palindrome(9))
print(palindrome(99))
print(palindrome(999))
print(palindrome(9999))
print(palindrome(99999))
print(palindrome(999999))
print("%d seconds" % (time.time()-start))
示例输出:
9 9009 906609 99000099 9966006699 999000000999 0.731034 seconds
推荐阅读
- c# - Log4Net 和 userSettings 结合导致配置问题
- python - python获取json键作为完整路径
- javascript - Ag-Grid:如何保存和重新加载列顺序
- ruby-on-rails - Rails 5 has_many 和 belongs_to :如何获取顶级 id
- c - C用循环初始化结构
- r - 将时间戳转换为日期、时间、小时、分钟
- vba - PowerPoint VBA - 基于水平轴数据标签的图表颜色
- reactiveui - ReactiveUI WhenActivated 在 Android 上抛出 ObjectDisposedException
- python - 用另一列中的值替换熊猫列值
- python - 连接到 Firestore 上的辅助数据库