程序地址:http://www.cheemoedu.com/exercise/24
问题描述:
素数的平方是回文,比如11*11=121。
求不超过1000的平方回文素数。
我的代码:
import math def prime(m): count=0 for i in range(2,int(math.sqrt(m))+1): if m%i==0: count=1 if count!=1: return True else: return False def palindrome(n): if str(n**2)==str(n**2)[::-1]: return True else: return False for j in range(2,1000): if prime(j) and palindrome(j): print j,
结果:
2 3 11 101 307
我的思路:
过程很简单,还是定义两个函数,一个用来判断出入的数是否是素数,另一个用来判断传入数的平方是否为回文数,最后遍历2到1000中的数,输出同时满足数是素数且数的平方是回文数这两个条件的数;
示例代码:
import math def isPrimeNumber(num): i = 2 x = math.sqrt(num) while i < x: if num%i == 0: return False i += 1 return True def Reverse(num): rNum = 0 while num: rNum = rNum*10 + num%10 num /= 10 return rNum def RPrimeNumber(num): arr = [] i = 2 while i < num: if isPrimeNumber(i) and i**2 == Reverse(i**2): arr.append(i) i += 1 return arr print RPrimeNumber(1000)
结果:
[2, 3, 11, 101, 121, 307]
示例代码的结果中的121是错误的,121=11*11 121*121=14641,如果这算是对的,那么111也应该算进去的,111=3*37 111*111=12321
更改:
将示例代码中while i < x改为while i <= x即可,错误的原因是判断素数的取值范围(2到数的平方根之间的值,)错误,少算了math.sqrt(num);
更改后的结果:
[2, 3, 11, 101, 307]
原文地址:http://jmbzs.blog.51cto.com/9449309/1792811