展开全部
这个竟然没有人回答。。我来写一个,如果有bug还请大神指出 = =:import math
def isPrime(num):
# 如果被2到根号num之间的数整636f70793231313335323631343130323136353331333339653733除则不是素数
maxDiv = int(math.sqrt(num))
for d in range(2, maxDiv+1):
if num % d == 0:
return False
return True
def isPalindrome(num):
# 转成字符串判断是不是回文,效率较低。
# 但按照数字来判断的话,代码可能比这个难读。
s = str(num)
i = 0; j = len(s) - 1
while i
if s[i] != s[j]:
return False
i += 1; j -= 1
return True
def main():
for num in range(10000, 100000):
if isPrime(num) and isPalindrome(num):
print num
main()
输出如下:
10301
10501
10601
11311
11411
12421
12721
12821
13331
13831
13931
14341
14741
15451
15551
16061
16361
16561
16661
17471
17971
18181
18481
19391
19891
19991
30103
30203
30403
30703
30803
31013
31513
32323
32423
33533
34543
34843
35053
35153
35353
35753
36263
36563
37273
37573
38083
38183
38783
39293
70207
70507
70607
71317
71917
72227
72727
73037
73237
73637
74047
74747
75557
76367
76667
77377
77477
77977
78487
78787
78887
79397
79697
79997
90709
91019
93139
93239
93739
94049
94349
94649
94849
94949
95959
96269
96469
96769
97379
97579
97879
98389
98689
在网上找到一个效率更高的方法,直接生成5位回文数,然后遍历回文数判断它是不是素数就好了,这样减少了很多数字的遍历:import math
def isPrime(num):
# 如果被2到根号num之间的数整除则不是素数
maxDiv = int(math.sqrt(num))
for d in range(2, maxDiv+1):
if num % d == 0:
return False
return True
def palindromeList():
for d1 in range(1, 10):
for d2 in range(0, 10):
for d3 in range(0, 10):
yield(d1*10000 + d2*1000 + d3*100 + d2*10 + d1)
def main():
for num in palindromeList():
if isPrime(num):
print num
main()