首页 > 解决方案 > 使用 numpy 找到由两个 3 位数字的乘积构成的最大回文

问题描述

当我尝试使用 numpy 包解决这个问题时,我陷入了困境。我的想法是,我将乘以并保留我对从 100 到 999 的 3 位数字所做的所有计算的列表,然后检查列表以查看哪些是回文并保存它们。最后,我将排序列表并获得最大的回文。下面的代码显示了我尝试做的事情。

import numpy as np

def void():
    list1 = np.array(range(100,999))
    list2 = np.array(range(100,999))
    k = []
    
    for i,j in zip(list1,list2):
        k.append(np.multiply(list1,list2))
        
    b = []
    
    for x in range(0,len(k)):
        if(reverseNum(k[x])==k[x]):
            b.append(k[x])
            
    print(b)
    print(b[-1])
    
def reverseNum(num):
    rev = 0
    
    while(num>0):
        rem = num % 10
        rev = (rev*10) +rem
        num = num // 10
        
    return rev  
    
void()

但是,当我尝试检查列表中的数字是否为回文时,出现以下错误:

Traceback (most recent call last):                                                                                    
  File "main.py", line 40, in <module>                                                                                
    void()                                                                                                            
  File "main.py", line 22, in void                                                                                    
    if(reverseNum(k[x]),k[x]):                                                                                        
  File "main.py", line 31, in reverseNum                                                                              
    while(num>0):                                                                                                     
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()  

这是否意味着无法使用 numpy 作为解决此问题的方法?如果是,我哪里错了?

编辑:到目前为止我所尝试的(因为它被问到):根据错误消息,我尝试使用np.equal以及np.greater而不是检查if(reverseNum(k[x])==k[x])num>0但它给出了相同的错误。

标签: pythonnumpy

解决方案


假设结果有六位数字的 NumPy 方式(它不能有更多,因为 999 2是 998001):

import numpy as np

v = np.arange(100, 1000)                     # the range of three-digit numbers
a = np.outer(v, v)                           # all the products
print(a[(a // 100000 == a % 10) &            # first digit == sixth digit
        (a // 10000 % 10 == a // 10 % 10) &
        (a // 1000 % 10 == a // 100 % 10)].max())

打印906609

使用纯 Python 进行双重检查:

>>> max(x*y
        for x in range(100, 1000)
        for y in range(100, 1000)
        if str(x*y) == str(x*y)[::-1])
906609

推荐阅读