python - 使用 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
但它给出了相同的错误。
解决方案
假设结果有六位数字的 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
推荐阅读
- android - 如何在 Visual Studio 的 Android 共享库 (.so) 项目中正确使用 c++ 静态库 (.lib)?
- python - 使用 Matplotlib 旋转矩阵
- php - 支付网关重定向后会话被销毁 - WORDPRESS & PHP
- reactjs - React Native:无法从不同组件的函数体内更新组件
- css - 在融合中摆脱内联 CSS 样式属性
- c++ - 为什么我不能在声明中定义静态字段?
- python - 我们如何使用带有多个 _ 的 split 函数
- java - 如何在 gitlab-ci build 中跳过前面的 maven 目标?
- nlp - 如何用spacy获得依赖树的高度?
- vb.net - 暂停调试器时如何阻止“不包括 System.Windows.Forms.pdb”窗口打开?