【问题标题】:highest palindrome with 3 digit numbers in pythonpython中具有3位数字的最高回文
【发布时间】: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

【问题讨论】:

标签: python math logic palindrome


【解决方案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 作为质因数。
                    猜你喜欢
                    • 1970-01-01
                    • 2014-09-15
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-08-20
                    • 2017-07-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多