鱼C论坛

 找回密码
 立即注册
查看: 4843|回复: 11

[技术交流] 17 - 数之吟唱:回文素数

[复制链接]
发表于 2021-7-27 19:27:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2023-6-28 18:19 编辑

在线课程:




                               
登录/注册后可看大图


回文数素数我们都搞定啦!

那么回文素数也顺道一起解决了吧!

纳尼?回文素数是神马东东呢?

听师妹细细道来!

所谓回文素数呢,指的是:

对一个整数 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 为回文素数,将其打印出来即可。

循环和判断素数的操作,我们在之前的课程都有说过啦,这里就不细致讲解咯。

但是要知道,到目前我们用了两种拆分数的方式:

  • 将整数按位地板除
  • 循环嵌套拆分

没有谁比谁好,看自己习惯了,黑猫白猫能抓着耗子的就是好猫~

好啦,这里我们用了四重循环嵌套:

  1. print("10000以内的回文素数:")
  2. for i in range(0, 9+1):
  3.     for j in range(0, 9+1):
  4.         for k in range(0, 9+1):
  5.             for l in range(0, 9+1):
复制代码

由于我们通过 for 循环依次构建 4 个位数,所以这次就不要拆分啦,直接组合就好:

  1. n = i * 1000 + j * 100 + k * 10 + l
  2. m = l * 1000 + k * 100 + j * 10 + i
复制代码

考虑到 i,j,k 为 0 的情况,倒过来的 m 要依次去掉 0:

  1. if i == 0 and j == 0 and k == 0:
  2.     m = m // 1000
  3. elif i == 0 and j == 0:
  4.     m = m // 100
  5. elif i == 0:
  6.     m = m // 10
复制代码

最后如果 m 和 n 相同,又是一个素数,那么就是我们要找的回文素数:

  1. if n > 10 and m == n and prime(n):
  2.     print(n, end=" ")
复制代码

我们自定义一个 prime() 函数用来判断素数,如果是就 return 1,反之 return 0:

  1. def prime(n):
  2.     m = math.sqrt(n)
  3.     i = 2
  4.     while i <= m:
  5.         if n % i == 0:
  6.             return 0
  7.         i += 1
  8.     return 1
复制代码

代码全都搞定了,聪明如你,相信也写出来了。

看下结果:
19-5.png

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

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

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

好的,下课!

源码: 17.py.zip (794 Bytes, 下载次数: 10, 售价: 8 鱼币)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
睦ちゃん她爹 + 5 + 5 + 3 视频呢?

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-27 20:25:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-27 20:30:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-27 23:27:35 From FishC Mobile | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-27 23:53:07 | 显示全部楼层
小师妹牛啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-3 09:29:30 | 显示全部楼层
视频在哪里?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-3 18:45:51 | 显示全部楼层
对于素数,我会采用线筛先筛选出来,作为一个列表

对于回文位会采用int(str(x)[::-1]) == x 来判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-3 20:46:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-9 17:00:54 | 显示全部楼层
  1. #判断素数
  2. count = 0
  3. start = int(input('指定开始的数:'))
  4. stop = int(input('指定结束的数:'))
  5. for i in range(start,stop+1):
  6.     for n in range(2,i):
  7.         if  i % n == 0:
  8.             break
  9.     else:
  10.         #判断回文
  11.         if str(i) == str(i)[::-1]:
  12.             print(f"{i}是回文素数",end=' ')
  13.             count += 1
  14.             if count % 6 == 0:
  15.                 print( )

  16. print(f'\n{start}到{stop}之间共有{count}个回文素数')[code]指定开始的数:1
  17. 指定结束的数:1000
  18. 1是回文素数 2是回文素数 3是回文素数 5是回文素数 7是回文素数 11是回文素数
  19. 101是回文素数 131是回文素数 151是回文素数 181是回文素数 191是回文素数 313是回文素数
  20. 353是回文素数 373是回文素数 383是回文素数 727是回文素数 757是回文素数 787是回文素数
  21. 797是回文素数 919是回文素数 929是回文素数
  22. 1到1000之间共有21个回文素数
复制代码
[/code]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-26 18:01:59 | 显示全部楼层
flag = 1
count = 0
m = [0] * 5
print("10000以内的回文素数:")
for n in range(10000):
    squ = n
    i, f, t = 0, 0, 1
    while n != 0:
        m[i] = n % 10
        n //= 10
        i += 1
    while i > 0:
        f += m[i - 1] * 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[len(m)-1-j]
    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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 04:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表