问题描述:
编写程序找出1 ~ 900之间的所有可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113、311)。
步骤
首先构造一个判断素数的函数;
for 循环取1~900 内的数字,判断是否是素数;
再把其顺序颠倒的数算出来 reduce(lambda)判断其是否是素数;
若符合要求,则输出 i
import math # 需要用到平凡根,要导入math
def sushu(n):
for k in range(2,int(math.sqrt(n)+1)):
if n%k==0:
return False
return True
for i in range(10,900):
if sushu(i):
b=[int(j) for j in str(i)] #将各位数字放到列表里
revernum=reduce(lambda x,y:x*10+y, b[::-1]) #求出反序数排列的数
if sushu(revernum):
print i
#结果
11
13
.....
757
761
**769**
**787**
797
分析:
-
首先,769这样的数字颠倒后是967,明显超出900,所以要考虑添加约束使颠倒后的数字也小于900,revernum<900;
-
787这样的数字,颠倒后不变,所以需要去除第一位和第三位相同的这类数字: b[0]!=b[len(b)-1]。
(最先想到了利用 set 不重复序列个数来做:len(b)!=len(set(b)),但行不通,因为这样会把311和113这样的数字也误删掉)*
代码改进
for i in range(10,900):
if sushu(i):
b=[int(j) for j in str(i)]
revernum=reduce(lambda x,y:x*10+y, b[::-1])
if revernum<900 and b[0]!=b[len(b)-1]: # if i != revernum <900 更简洁
if sushu(revernum):
print i, revernum
求颠倒后的数,学到了更简单的方法:revernum=int(str(i)[::-1])