鱼C-小师妹 发表于 2021-7-27 19:27:59

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
代码全都搞定了,聪明如你,相信也写出来了。

看下结果:


这一节课相当于复习,整合所学过的东西,来解决新问题。

课后作业就是你们去搞定代码啦!

不会的,请去论坛帖子下留言,小师妹看到就会来帮助你咯~

好的,下课!

源码:

柿子饼同学 发表于 2021-7-27 20:25:49

{:10_297:}

fish_nian 发表于 2021-7-27 20:30:43

{:10_275:}

YCZS 发表于 2021-7-27 23:27:35

加油

老迈 发表于 2021-7-27 23:53:07

小师妹牛啊!

睦ちゃん她爹 发表于 2021-8-3 09:29:30

视频在哪里?

Stubborn 发表于 2021-8-3 18:45:51

对于素数,我会采用线筛先筛选出来,作为一个列表

对于回文位会采用int(str(x)[::-1]) == x 来判断

hornwong 发表于 2021-8-3 20:46:25

{:5_95:}

游刃鱿鱼 发表于 2021-11-9 17:00:54

#判断素数
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个回文素数

Hyjxsssss 发表于 2022-5-9 14:07:15

# 题干
# 求出所有不超过 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))

憨憨学py 发表于 2022-7-26 18:01:59

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 19:59:02

本帖最后由 语与余 于 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]
查看完整版本: 17 - 数之吟唱:回文素数