分析回文顺序时如何避免列表?
How to avoid lists when analyzing order for palindromes?
对于您在阅读本文时可能遇到的一般编码和逻辑问题,我只想提前道歉。我最近发现了 Project Euler 并认为它很有趣。我强调的是,不仅要找到答案,而且要创建一个通用函数,它可以在给定适当输入的情况下为任何类似案例找到答案。例如,第 4 题,涉及回文,可以在这里看到:https://projecteuler.net/problem=4
基本上我所做的是找到一种方法,将给定数字 n 的每个可能的数字组合相乘,然后找到回文乘积。但是,超过 3 位数的任何内容都需要很长时间才能处理。我相信这是因为我使用了 list() 函数来利用索引来确定产品是否是回文。还有另一种方法可以做这种性质的事情吗?我觉得这是把一个正方形从一个圆孔里塞进去。
这是有问题的函数。
def palindrome(n):
number = 0
for i in range(0,n):
number = number + 9 * pow(10, i)
a = pow(10, n - 1) - 1
b = pow(10, n - 1)
while a * b < number * number:
a = a + 1
b = a
while b <= number:
c = a * b
b = b + 1
digits = list(str(int(c)))
lastdigits = digits[::-1]
numdigits = len(digits)
middle = int((numdigits - (numdigits % 2)) / 2) - 1
if numdigits > 1 and digits[:middle + 1] == lastdigits[:middle + 1] and digits[0] == digits[-1] == '9' and numdigits == 2 * n:
print(c)
"Find the largest palindrome made from the product of two 3-digit numbers."
3 位数可以是 100 - 999 之间的任何数字。关于最大乘积的一件事是有保证的:两个操作数必须尽可能大。
因此,从最大数 (999) 到最小数 (100) 逐步执行循环是有意义的。我们可以将回文添加到列表中,然后 return 最大的一个。
计算产品时,使用 str(...)
将其转换为字符串。现在,由于 python 的字符串拼接,检查回文很容易。如果 string == string[::-1]
,则字符串是回文,其中 string[::-1]
除了 return 原件的反转副本外什么都不做。
实施这些策略,我们有:
def getBiggestPalindrome():
max_palindrome = -1
for i in range(999, 99, -1):
for j in range(999, i - 1, -1):
prod = i * j
str_prod = str(prod)
if str_prod == str_prod[::-1] and prod > max_palindrome:
print(prod)
max_palindrome = prod
return max_palindrome
getBiggestPalindrome()
而且,这个 returns
>>> getBiggestPalindrome()
906609
请注意,您可以使用 range
函数生成从 start
到 end
和 step
的值。迭代在 end
之前停止,这意味着最后一个值将是 100。
对于您在阅读本文时可能遇到的一般编码和逻辑问题,我只想提前道歉。我最近发现了 Project Euler 并认为它很有趣。我强调的是,不仅要找到答案,而且要创建一个通用函数,它可以在给定适当输入的情况下为任何类似案例找到答案。例如,第 4 题,涉及回文,可以在这里看到:https://projecteuler.net/problem=4
基本上我所做的是找到一种方法,将给定数字 n 的每个可能的数字组合相乘,然后找到回文乘积。但是,超过 3 位数的任何内容都需要很长时间才能处理。我相信这是因为我使用了 list() 函数来利用索引来确定产品是否是回文。还有另一种方法可以做这种性质的事情吗?我觉得这是把一个正方形从一个圆孔里塞进去。
这是有问题的函数。
def palindrome(n):
number = 0
for i in range(0,n):
number = number + 9 * pow(10, i)
a = pow(10, n - 1) - 1
b = pow(10, n - 1)
while a * b < number * number:
a = a + 1
b = a
while b <= number:
c = a * b
b = b + 1
digits = list(str(int(c)))
lastdigits = digits[::-1]
numdigits = len(digits)
middle = int((numdigits - (numdigits % 2)) / 2) - 1
if numdigits > 1 and digits[:middle + 1] == lastdigits[:middle + 1] and digits[0] == digits[-1] == '9' and numdigits == 2 * n:
print(c)
"Find the largest palindrome made from the product of two 3-digit numbers."
3 位数可以是 100 - 999 之间的任何数字。关于最大乘积的一件事是有保证的:两个操作数必须尽可能大。
因此,从最大数 (999) 到最小数 (100) 逐步执行循环是有意义的。我们可以将回文添加到列表中,然后 return 最大的一个。
计算产品时,使用 str(...)
将其转换为字符串。现在,由于 python 的字符串拼接,检查回文很容易。如果 string == string[::-1]
,则字符串是回文,其中 string[::-1]
除了 return 原件的反转副本外什么都不做。
实施这些策略,我们有:
def getBiggestPalindrome():
max_palindrome = -1
for i in range(999, 99, -1):
for j in range(999, i - 1, -1):
prod = i * j
str_prod = str(prod)
if str_prod == str_prod[::-1] and prod > max_palindrome:
print(prod)
max_palindrome = prod
return max_palindrome
getBiggestPalindrome()
而且,这个 returns
>>> getBiggestPalindrome()
906609
请注意,您可以使用 range
函数生成从 start
到 end
和 step
的值。迭代在 end
之前停止,这意味着最后一个值将是 100。