寻找回文数,回文数是指从左往右读和从右往左读都一样的数字。两个两位数相乘,可获得的最大回文数是9009=91×99。让我们试着寻找由两个三位数相乘而获得的最大回文数。
具体步骤
我们将使用NumPy中的arange
函数,创建一个包含全部三位数字(100~999)的数组。
- 创建一个由三位数构成的数组。
用numpy.testing包中的assert_equal
函数,检查数组中的第一个和最后一个元素是否正确。
a = numpy.arange(100, 1000)
numpy.testing.assert_equal(100, a[0])
numpy.testing.assert_equal(999, a[-1])
- 创建乘积数组。
我们将创建一个数组,用来存放所有可能的三位数两两相乘的结果。可以用outer
函数实现这个外积运算,再把得到的数组用ravel
函数展开,以便进行查找。还需要调用数组对象的sort
方法,确保数组元素已正确排序。之后,我们可以做一些正确性检查。
numbers = numpy.outer(a, a)
numbers = numpy.ravel(numbers)
numbers.sort()
numpy.testing.assert_equal(810000, len(numbers))
numpy.testing.assert_equal(10000, numbers[0])
numpy.testing.assert_equal(998001, numbers[-1])
完整代码如下。
import numpy
import numpy.testing
#回文数从左往右读和从右往左读都一样。
#两个两位数相乘可获得的最大回文数是9009 = 91 x 99。
#寻找由两个三位数相乘而获得的最大回文数。
#1. 创建一个由三位数构成的数组
a = numpy.arange(100, 1000)
numpy.testing.assert_equal(100, a[0])
numpy.testing.assert_equal(999, a[-1])
#2. 创建乘积数组
numbers = numpy.outer(a, a)
numbers = numpy.ravel(numbers)
numbers.sort()
numpy.testing.assert_equal(810000, len(numbers))
numpy.testing.assert_equal(10000, numbers[0])
numpy.testing.assert_equal(998001, numbers[-1])
#3. 查找最大回文数
for i in xrange(-1, -1 * len(numbers), -1):
s = str(numbers[i])
if s == s[::-1]:
print s
break
这段代码的执行结果是显示出906609这个回文数。
小结
我们看到了outer
函数的实际应用,该函数返回的是两个数组的外积。sort
函数返回的是某个数组排序后的副本。