上QQ阅读APP看书,第一时间看更新
3.5.2 代码改进——求回文素数
解决回文数的问题好像没什么难度,我们可以对题目进行一下升级。素数是指大于1且因数只有1和它本身的数,回文素数既满足素数的特点,又满足回文数的特点的数字。现在输入一个数N,求出大于或等于数N的最小回文素数。
这道题看上去没有什么特别的,使用暴力尝试的方式总会找到满足条件的数,但是实际上暴力尝试并不可行,当输入的数值在7位以上时,这种尝试的耗时将非常巨大,因此我们必须采用一些优化手段。
由于本题是将回文数与素数相结合,在数学上,素数是一种性质特殊的数,因此可以通过如下两条定理对算法进行优化:
(1)除了11以外,其他偶数位的回文数都能被11整除。
(2)除了2和3外,其他所有的素数对6取余一定等于5或者1。
关于上面两条数学定义的推导过程,这里就不再赘述了,大家可以在互联网或数论相关图书中找到对应的方法。这里我们只关心如何应用这两条定理来简化程序逻辑。
由上面的第1条数学规律可知,除了数字11外,在暴力尝试时我们可以将所有的偶数位数的数值剔除掉。由上面第2条数学规律可知我们可以在素数验证前先通过取模运算进行一轮筛选,并且暴力尝试的步长也可以根据取模运算的结果进行调整。示例代码如下:
之前我们在解决编程题时,总是认为计算机的计算速度非常快,无须担心运算时间问题。其实不然,原理上来说只要时间足够,世界上任何密码都可以被暴力破解,但是在实际工程应用中却并不现实,数学上很多计算的复杂度往往是呈指数级增长的,超出计算机的性能极限也不是什么稀奇的事。因此,我们在解决问题时,除了要思考如何找到正确的结果外,也要思考如何提高程序运行的效率,尽量减少不必要的计算。