Numpy 寻找回文数

寻找回文数,回文数是指从左往右读和从右往左读都一样的数字。两个两位数相乘,可获得的最大回文数是9009=91×99。让我们试着寻找由两个三位数相乘而获得的最大回文数。

具体步骤

我们将使用NumPy中的arange函数,创建一个包含全部三位数字(100~999)的数组。

  1. 创建一个由三位数构成的数组。

numpy.testing包中的assert_equal函数,检查数组中的第一个和最后一个元素是否正确。

a = numpy.arange(100, 1000)
numpy.testing.assert_equal(100, a[0])
numpy.testing.assert_equal(999, a[-1])    

  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函数返回的是某个数组排序后的副本。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程