问题描述:
素数的平方是回文,比如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]