马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2023-6-28 18:19 编辑
在线课程:
回文数和素数我们都搞定啦!
那么回文素数也顺道一起解决了吧!
纳尼?回文素数是神马东东呢?
听师妹细细道来!
所谓回文素数呢,指的是:
对一个整数 n 从左向右和从右向左读其数值都相同且 n 为素数,则称整数 n 为回文素数。
是不是还有点绕,别着急,上例子。
对于偶数位的整数,除了 11 以外,都不存在回文素数。
即所有的 4 位整数、6 位整数、8 位整数等都不存在回文素数。
我们可以先列出两位和三位整数中包含的所有回文素数。
两位回文素数:
三位回文素数:
101,131,151,181,191,313,353,373,383,727,757,787,797,919,929
懂了吧,我们今天求出所有不超过 10000 的回文素数。
如果学完之前的课程,判断素数的方法应该没问题了。
因此本题的难点就在于要解决:
最直接也最容易想到的方法就是是穷举法。
对 10000 以内的每一个整数 n 进行考察,判断 n 是否为回文数。
如果 n 是回文数,再判断它是否为素数。
对于既是回文数也是素数的整数 n 就是我们要求的回文素数,将其打印输出即可。
我们采用穷举法来构造一个整数并求与其对应的反序数,若整数与其反序数相等,则该整数是回文数。
用了穷举法,那么循环嵌套肯定跑不了。
通过四重循环来遍历所有 10000 以内的整数。
用 4 个循环变量来构造整数 n,同时,这 4 个循环变量反序便可以构造出 n 的反序数 m。
如果 n 的前几位出现 0 的情况,那么反序过来的 m,二者值肯定不相同。
我们这里需要进行“去0”操作,举个例子。
例如:n 为 0011,那么它的反序数就是 1100,二者虽然不同,但其实 0011 也是我们要的回文素数。
此时就需要去 0 操作。
如果上面的流程搞定了,就要判断 n 是否是素数,如果 n 也同时为素数,则 n 为回文素数,将其打印出来即可。
循环和判断素数的操作,我们在之前的课程都有说过啦,这里就不细致讲解咯。
但是要知道,到目前我们用了两种拆分数的方式:
没有谁比谁好,看自己习惯了,黑猫白猫能抓着耗子的就是好猫~
好啦,这里我们用了四重循环嵌套:
print("10000以内的回文素数:")
for i in range(0, 9+1):
for j in range(0, 9+1):
for k in range(0, 9+1):
for l in range(0, 9+1):
由于我们通过 for 循环依次构建 4 个位数,所以这次就不要拆分啦,直接组合就好:
n = i * 1000 + j * 100 + k * 10 + l
m = l * 1000 + k * 100 + j * 10 + i
考虑到 i,j,k 为 0 的情况,倒过来的 m 要依次去掉 0:
if i == 0 and j == 0 and k == 0:
m = m // 1000
elif i == 0 and j == 0:
m = m // 100
elif i == 0:
m = m // 10
最后如果 m 和 n 相同,又是一个素数,那么就是我们要找的回文素数:
if n > 10 and m == n and prime(n):
print(n, end=" ")
我们自定义一个 prime() 函数用来判断素数,如果是就 return 1,反之 return 0:
def prime(n):
m = math.sqrt(n)
i = 2
while i <= m:
if n % i == 0:
return 0
i += 1
return 1
代码全都搞定了,聪明如你,相信也写出来了。
看下结果:
这一节课相当于复习,整合所学过的东西,来解决新问题。
课后作业就是你们去搞定代码啦!
不会的,请去论坛帖子下留言,小师妹看到就会来帮助你咯~
好的,下课!
源码:
17.py.zip
(794 Bytes, 下载次数: 11, 售价: 8 鱼币)
|