17 - 数之吟唱:回文素数
本帖最后由 不二如是 于 2023-6-28 18:19 编辑在线课程:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=19
https://xxx.ilovefishc.com/forum/202105/31/204333obvdca8ankppcn9v.png.thumb.jpg
回文数和素数我们都搞定啦!
那么回文素数也顺道一起解决了吧!
纳尼?回文素数是神马东东呢?
听师妹细细道来!
所谓回文素数呢,指的是:
对一个整数 n 从左向右和从右向左读其数值都相同且 n 为素数,则称整数 n 为回文素数。
是不是还有点绕,别着急,上例子。
对于偶数位的整数,除了 11 以外,都不存在回文素数。
即所有的 4 位整数、6 位整数、8 位整数等都不存在回文素数。
我们可以先列出两位和三位整数中包含的所有回文素数。
两位回文素数:
11
三位回文素数:
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
代码全都搞定了,聪明如你,相信也写出来了。
看下结果:
这一节课相当于复习,整合所学过的东西,来解决新问题。
课后作业就是你们去搞定代码啦!
不会的,请去论坛帖子下留言,小师妹看到就会来帮助你咯~
好的,下课!
源码: {:10_297:} {:10_275:} 加油 小师妹牛啊! 视频在哪里? 对于素数,我会采用线筛先筛选出来,作为一个列表
对于回文位会采用int(str(x)[::-1]) == x 来判断 {:5_95:} #判断素数
count = 0
start = int(input('指定开始的数:'))
stop = int(input('指定结束的数:'))
for i in range(start,stop+1):
for n in range(2,i):
ifi % n == 0:
break
else:
#判断回文
if str(i) == str(i)[::-1]:
print(f"{i}是回文素数",end=' ')
count += 1
if count % 6 == 0:
print( )
print(f'\n{start}到{stop}之间共有{count}个回文素数')指定开始的数:1
指定结束的数:1000
1是回文素数 2是回文素数 3是回文素数 5是回文素数 7是回文素数 11是回文素数
101是回文素数 131是回文素数 151是回文素数 181是回文素数 191是回文素数 313是回文素数
353是回文素数 373是回文素数 383是回文素数 727是回文素数 757是回文素数 787是回文素数
797是回文素数 919是回文素数 929是回文素数
1到1000之间共有21个回文素数 # 题干
# 求出所有不超过 10000 的回文素数
start = int(input('start = '))
end = int(input('end = '))
count = 0
for n in range(start, end+1):
factorstorage = []
for i in range(2, n):
if n%i == 0:
factorstorage.append(i)
break
if len(factorstorage) == 0: #n为素数,进一步判断是不是回文素数
ninitial = list(str(n))
if len(ninitial) == 1 or ((len(ninitial)>2) and (len(ninitial)%2 == 0)):
continue
else:
ncontrast = ninitial.copy() #对照组
ninitial.reverse()
njudge = ninitial #判断组
if ncontrast == njudge:
count += 1
if count%4 != 0:
print(n, '\t', end = '')
else:
print(n)
print('\n经统计 %d - %d 中共有 %d 个素数' % (start, end, count)) flag = 1
count = 0
m = * 5
print("10000以内的回文素数:")
for n in range(10000):
squ = n
i, f, t = 0, 0, 1
while n != 0:
m = n % 10
n //= 10
i += 1
while i > 0:
f += m * t
t *= 10
i -= 1
if squ == f and squ >1:
k = math.sqrt(f)
i=2
while i <= k:
if f % i == 0:
flag = 0
break
i += 1
if flag == 1:
print(f, end=" ")
count += 1
flag = 1 本帖最后由 语与余 于 2022-11-14 20:03 编辑
import math
def prime_number(x):
for each in range(2,int(math.sqrt(x))+1):
if x % each == 0:
return 0
else:
return x
for i in range(10,10000):
m,n = '',''
m = str(i)
for j in range(len(m)):
n += m
if m == n:
if prime_number(i) != 0:
print(i)
下面判断优化改进:
for i in range(10,10000):
if str(i) == str(i)[::-1]:
if prime_number(i) != 0:
print(i)
页:
[1]