回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。
找出由两个3位数字的乘积制成的最大回文。
这是我在python 3.5中的脚本:
def plin1():
for i in range(1000,1):
for j in range(1000,1):
if str(i*j)==str(i*j)[::-1]:
break
return i*j
print(i,'*',j,'=',i*j)
但是当我调用此功能时,没有打印任何内容。怎么了?
答案 0 :(得分:1)
当
range(start, stop[, step]) -> range object
range()
为正时, step
要求第一个参数小于第二个参数,当使用2个参数调用step
时,range()
要求默认为1。因此,范围对象产生一个空序列,并且永远不会输入for循环的主体:
>>> list(range(1000, 1))
[]
但是,通过为step
指定负值,您可以获得所需的序列,例如:
>>> list(range(10, 1))
[]
>>> list(range(10, 1, -1))
[10, 9, 8, 7, 6, 5, 4, 3, 2]
所以在你的情况下你会这样做:
for i in range(999, 99, -1):
for j in range(999, 99, -1):
# etc...
然后迭代从最大的所有3位数开始。
return
的使用也是错误的,它将导致函数终止而不打印任何内容。这是一个更正版本:
def plin1():
for i in range(999, 99, -1):
for j in range(999, 99, -1):
if str(i*j) == str(i*j)[::-1]:
return i*j
print(i,'*',j,'=',i*j)
现在该函数仅在找到回文时才返回该值。如果没有回文,该函数将返回None
。
但是,请注意,这不会产生最大的回文,它是两个3位数字的乘积。此函数返回580085,即995 * 583.但最大的一个是993 * 913 = 906609.您需要确定哪个是所有产品中最大的回文,而不仅仅是找到的第一个回文。这是一个生成所需结果的生成器表达式:
max((i*j,i,j) for i in range(100, 1000) for j in range(100, 1000)
if str(i*j) == str(i*j)[::-1])
产生元组(906609, 993, 913)
。
可能会有一些优化可以减少计算次数。
答案 1 :(得分:0)
range
的{p> i
,j
生成从i
到j
的范围。如果i > j
则没有生成范围,并且在迭代该范围时没有任何反应。
范围也采用“步”参数,允许您设置范围的增量。也许你打算用它。它看起来像这样:
for i in range(1, 1000, 1):
# loop body
请注意,指定步长为1是多余的,因为1是该参数的默认值。
如果要生成“做正确的事”范围以生成从(i,j)中的较小者到较大者的范围,您可以编写如下函数:
def dwim_range(i,j):
return range(*sorted((i,j)))
在这里,您要对元组(i, j)
进行排序,然后使用*
运算符对其进行解包,以便range
按排序顺序获取元组的两个项目。