python中具有3位数字的最高回文
Posted
技术标签:
【中文标题】python中具有3位数字的最高回文【英文标题】:highest palindrome with 3 digit numbers in python 【发布时间】:2012-09-22 08:49:52 【问题描述】:http://projecteuler.net/ 的问题 4 中说:
回文数的两种读法相同。由两个 2 位数乘积构成的最大回文数是 9009 = 91 * 99。
找出由两个 3 位数乘积构成的最大回文数。
我这里有这段代码
def isPalindrome(num):
return str(num) == str(num)[::-1]
def largest(bot, top):
for x in range(top, bot, -1):
for y in range(top,bot, -1):
if isPalindrome(x*y):
return x*y
print largest(100,999)
它应该找到最大的回文,它吐出580085
,我认为这是正确的,但欧拉项目不这么认为,我这里有什么问题吗?
当我崇敬 for 循环时,我没有考虑清楚,我删除了检查最大的、愚蠢的我的东西。这是工作代码
def isPalindrome(num):
return str(num) == str(num)[::-1]
def largest(bot, top):
z = 0
for x in range(top, bot, -1):
for y in range(top,bot, -1):
if isPalindrome(x*y):
if x*y > z:
z = x*y
return z
print largest(100,999)
它吐出 906609
【问题讨论】:
因为我得到了 995 * 583 = 580085 forum.projecteuler.net/…,更具体地说,forum.projecteuler.net/viewtopic.php?f=50&t=1989 没有阅读论坛...我应该删除这个吗? 这确实不违反规则......它不在论坛上...... 【参考方案1】:反向迭代没有找到最大的x*y
,它找到了最大的x
的回文。有比 580085 更大的答案;它的x
更小,y
更大。
【讨论】:
嗯,让我们稍微改变一下,brb。 同意。您需要测试每个组合并跟踪最大的组合,而不是在找到回文后立即返回。【参考方案2】:这会更有效地写成:
from itertools import product
def is_palindrome(num):
return str(num) == str(num)[::-1]
multiples = ( (a, b) for a, b in product(xrange(100,999), repeat=2) if is_palindrome(a*b) )
print max(multiples, key=lambda (a,b): a*b)
# (913, 993)
如果您在 Python 中进行 Euler,您会发现 itertools
和生成器非常有用。
【讨论】:
我只使用python,因为它是一种解释语言,否则我会使用java @SmartLemon 很公平 - Haskell 也非常有用 ;) @SmartLemon 对于这类事情——绝对是——查看 Euler 答案板上的 haskell 解决方案,看看你已经解决的问题——你会发现代码 sn-p(我认为还有一个网站,它也为 Haskell 中的前“n”个问题编写了代码)【参考方案3】:不是最有效的答案,但我确实喜欢它足够紧凑,可以放在一条线上。
print max(i*j for i in xrange(1,1000) for j in xrange(1,1000) if str(i*j) == str(i*j)[::-1])
【讨论】:
【参考方案4】:尝试让它更高效,同时保持清晰:
def is_palindrome(num):
return str(num) == str(num)[::-1]
def fn(n):
max_palindrome = 1
for x in range(n,1,-1):
for y in range(n,x-1,-1):
if is_palindrome(x*y) and x*y > max_palindrome:
max_palindrome = x*y
elif x * y < max_palindrome:
break
return max_palindrome
print fn(999)
【讨论】:
【参考方案5】:这里我添加了两个'break'来提高这个程序的速度。
def is_palindrome(num):
return str(num) == str(num)[::-1]
def max_palindrome(n):
max_palindrome = 1
for i in range(10**n-1,10**(n-1)-1,-1):
for j in range(10**n-1,i-1,-1):
if is_palindrome(i*j) and i*j > max_palindrome:
max_palindrome = i * j
break
elif i*j < max_palindrome:
break
return max_palindrome
n=int(raw_input())
print max_palindrome(n)
【讨论】:
非常感谢您发表评论以澄清您的代码【参考方案6】:简单:
def is_pallindrome(n):
s = str(n)
for n in xrange(1, len(s)/2 + 1):
if s[n-1] != s[-n]:
return False
return True
largest = 0
for j in xrange(100, 1000):
for k in xrange(j, 1000):
if is_pallindrome(j*k):
if (j*k) > largest: largest = j*k
print largest
【讨论】:
【参考方案7】:不必每次都从999开始,因为之前已经找到了。下面是一个使用字符串函数的简单方法,使用三位数字找到最大回文
def palindrome(y):
z=str(y)
w=z[::-1]
if (w==z):
return 0
elif (w!=z):
return 1
h=[]
a=999
for i in range (999,0,-1):
for j in range (a,0,-1):
l=palindrome(i*j)
if (l==0):
h=h+[i*j]
a-=1
print h
max=h[0]
for i in range(0,len(h)):
if (h[i] > max):
max= h[i]
print "largest palindrome using multiple of three digit number=%d"%max
【讨论】:
【参考方案8】:这是我解决此问题的代码。
lst = []
for i in range(100,1000):
for n in range(2,i) :
lst.append (i* n)
lst.append(i*i)
lst2=[]
for i in lst:
if str(i) == str(i)[::-1]:
lst2.append(i)
print max(lst2)
【讨论】:
【参考方案9】:这是我的 Python 代码:
max_pal = 0
for i in range(100,999):
for j in range(100,999):
mult = i * j
if str(mult) == str(mult)[::-1]: #Check if the number is palindrome
if mult > max_pal:
max_pal = mult
print (max_pal)
【讨论】:
添加几行注释/解释您的方法会很有用。【参考方案10】:def div(n):
for i in range(999,99,-1):
if n%i == 0:
x = n/i
if x % 1 == 0:
x = n//i
if len(str(x)) == 3:
print(i)
return True
return False
def palindrome():
ans = []
for x in range(100*100,999*999+1):
s = str(x)
s = int (s[::-1])
if x - s == 0:
ans.append(x)
for x in range(len(ans)):
y = ans.pop()
if div(y):
return y
print(palindrome())
【讨论】:
【参考方案11】:580085 = 995 X 583,其中 906609 = 993 X 913。 从上到下用暴力破解才发现的!
【讨论】:
【参考方案12】:这是我在python中创建的用于检查3位数字的乘积是否为回文的函数
功能:
def is_palindrome(x):
i = 0
result = True
while i < int(len(str(x))/2):
j = i+1
if str(x)[i] == str(x)[-(j)]:
result = True
else:
result = False
break
i = i + 1
return result
主要:
max_pal = 0
for i in range (100,999):
for j in range (100,999):
x = i * j
if (is_palindrome(x)):
if x > max_pal:
max_pal = x
print(max_pal)
【讨论】:
【参考方案13】:这是我的解决方案:
lst1 = [x for x in range(1000)]
palindrome = []
def reverse(x):
a = str(x)[::-1]
return int(a)
x = 0
while x < len(lst1):
for y in range(1000):
z = lst1[x] * y
if z == reverse(z):
palindrome.append(z)
x += 1
duppal = set(palindrome)
sortpal = sorted(duppal)
total = sortpal[-1]
print(sortpal)
print('Largest palindrome: ' + str(total))
【讨论】:
【参考方案14】:重新思考:效率和性能
def palindrome(n):
maxNumberWithNDigits = int('9' * n) #find the max number with n digits
product = maxNumberWithNDigits * maxNumberWithNDigits
#Since we are looking the max, stop on the first match
while True:
if str(product) == str(product)[::-1]: break;
product-=1
return product
start=time.time()
palindrome(3)
end=time.time()-start
回文...:997799,0.000138998031616 秒
【讨论】:
回文 997799 不是两个 3 位数字的乘积,它有 11 和 90709 作为质因数。以上是关于python中具有3位数字的最高回文的主要内容,如果未能解决你的问题,请参考以下文章