Python练习(10)

问题描述:

编写程序找出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])

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/82947112