python输出回文素数_解决Python中回文数和质数的问题

本文围绕Python中回文素数的判断展开。先介绍素数判断,强调for…else用法及遍历范围优化;接着说明回文数判断方法,还提及可用双端队列简化;最后给出四种判断回文素数的代码版本,并指出嵌套先求回文再判素数性能较好,有助于加深对循环else用法的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试了快30min,再接着一通搜索和回看视频才发现问题所在。所以特地写下来,方便以后查看。问题的关键是判断素数过程中for…else的用法上(具体看后面代码)

二、实现判断素数的功能

质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。via——Wikipedia

所以采用穷举法只要在2~n-1的区间,没有一个数能整除n,那么n就是素数。

对2-n-1区间进行合理优化,假设x*y=n(x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt(n),所以x的区间就可以限制为2~sqrt(n)+1。还有疑问,可以在再多想想,纸上算一算。

因为这里要用到sqrt()方法,所以需要导入math模块。

不多说,直接上代码:

# 求解1000以内的所有素数,正确版本

import math

num = 2

count = 0

list_s = []

max_d = 1000

while num < max_d:

length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化

for i in range(2,length): # 注意从2开始

if num % i == 0:

break

else: # 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行

count += 1

list_s.append(num) # 存入列表

num += 1

if count == 0:

print(max_d,'以内没有素数')

else:

print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

这个代码完全没有问题,然后下面给出一个有问题的代码:

# 求解40以内的所有素数,错误版本

import math

num = 2

count = 0

list_s = []

max_d = 40

while num < max_d:

length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化

for i in range(2,length): # 注意从2开始

if num % i == 0:

break

else: # 这里的else跟if对齐,会导致一个素数会被写入int(math.sqrt(num))-1次,同时一些非素数也会被当做素数

count += 1

list_s.append(num) # 存入列表

num += 1

if count == 0:

print(max_d,'以内没有素数')

else:

print(max_d,'以内的素数有',count,'个,分别是:',list_s)

输出结果:

所以,一定要认真对待循环中else对齐问题。这个在解决素数问题中很重要。小结一下while…else和for…else

只有循环完所有次数,才会执行 else ,循环体中有continue存在,也不影响else执行。

一旦循环体中触发了break ,就会阻止 else 语句块的执行。

三、实现判断回文数的功能

回文数即从左到右和从右到左一样。如:12321。

方法:

把已知的num1数反过来,得到num2,如123变为321,采用//10 %10 *10等运算操作,其中还要借助一个临时变量tmp

判断如果num1 == num 2,则num1是回文数,反之不是

代码如下:

# 求解1000以内的所有回文数

num = 0 # 这里num从0开始

list_h = []

max_d = 10000

count = 0

while num < max_d:

tmp = num

num_p = 0

while tmp != 0:

num_p = num_p*10 + tmp % 10

tmp //= 10

if num_p == num:

list_h.append(num)

count += 1

num += 1

if count == 0:

print(max_d,'以内没有回文数')

else:

print(max_d,'以内的回文数有',count,'个,分别是:',list_h)

更新:对于判断回文数或者回文字符串,采用双端队列的数据结构,会非常简单。实现如下:

from collections import deque

def palindrome(word):

dq = deque(word)

while len(dq) > 1:

if dq.pop() != dq.popleft():

return False

return True

if __name__ == '__main__':

max_num = 10000

for i in range(max_num):

s = str(i)

if palindrome(s):

print(i, end=',')

四、实现同时判断回文数和质数

需要选择是否嵌套以及先判断回文还是先判断素数,所以又四个版本。大家可以自己思考每个版本的性能上有无区别,占用空间有无区别。因为我也没有太想明白,所以没有放上来。

我写了四个版本,都能实现需求。不过从性能上,在我测试的100-1000000区间,采用嵌套的先求解回文再判断素数要快一些。

不多说,四个版本的代码全部在写下面,可以自行删掉相应的'''标记进行测试。

'''

# 版本一、求1000以内的回文素数,多层嵌套,先求素数后回文数

import math

num = 2

count = 0

list_s = []

list_sh = []

max_d = 1000

while num < max_d:

length = int(math.sqrt(num)+1)

for i in range(2,length):

if num % i == 0:

break

else:

list_s.append(num)

tmp = num

num_p = 0

while tmp != 0:

num_p = num_p * 10 + tmp % 10

tmp //= 10

if num == num_p:

list_sh.append(num)

count +=1

num += 1

print(max_d,'以内的素数有:',list_s)

if count == 0:

print(max_d,'以内没有既是素数又是回文数的数')

else:

print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)

'''

'''

# 版本二、求1000以内的回文素数,多层嵌套,先求回文数后求素数

import math

num = 2

count = 0

list_h = []

list_hs = []

max_d = 1000

while num < max_d:

tmp = num

num_p = 0

while tmp != 0:

num_p = num_p * 10 + tmp % 10

tmp //= 10

if num == num_p:

list_h.append(num)

length = int(math.sqrt(num)+1)

for i in range(2,length):

if num % i == 0:

break

else:

list_hs.append(num)

count +=1

num += 1

print(max_d,'以内的素数有:',list_h)

if count == 0:

print(max_d,'以内没有既是素数又是回文数的数')

else:

print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_hs)

'''

'''

# 版本三、求1000以内的回文素数,先求素数再求回文数

import math

num = 2

list_s = []

max_d = 1000

while num < max_d:

length = int(math.sqrt(num)+1)

for i in range(2,length):

if num % i == 0:

break

else: # 注意这里的else是和for对齐

list_s.append(num)

num += 1

count = 0

list_sh = []

for i in list_s:

tmp = i

num_p = 0

while tmp != 0:

num_p = num_p*10 + tmp % 10

tmp //= 10

if num_p == i:

list_sh.append(i)

count += 1

print(max_d,'以内的素数有:',list_s)

if count == 0:

print(max_d,'以内没有既是素数又是回文数的数')

else:

print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)

'''

'''

# 版本四、求1000以内的回文素数,先求回文数,再求素数

import math

num = 2

list_h = []

max_d = 10000

while num < max_d:

tmp = num

num_p = 0

while tmp != 0:

num_p = num_p*10 + tmp % 10

tmp //= 10

if num_p == num:

list_h.append(num)

num += 1

count = 0

list_sh = []

for hn in list_h:

length = int(math.sqrt(hn)+1)

for i in range(2,length):

if hn % i == 0:

break

else: # 注意这里的else是和for对齐

list_sh.append(hn)

count += 1

print(max_d,'以内的回文数有:',list_h)

if count == 0:

print(max_d,'以内没有既是素数又是回文数的数')

else:

print(max_d,'以内既是素数又是回文数的数有',count,'个,分别是:',list_sh)

'''

五、总结

这个过程帮助自己更加深刻的理解了if…elif…else 、for…else和while…else以后使用时会更加注意。

以上这篇解决Python中回文数和质数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

### 回文素数的生成与判断 在Python中,可以通过编写函数来实现回文素数的生成或判断。以下是两种方法的具体实现: #### 方法一:生成前n个回文素数 以下代码实现了根据用户输入的正整数`n`,输出从小到大排列的前`n`个回文素数,并用空格分隔: ```python def is_prime(num): if num < 2: return False for i in range(2, int(num**0.5) + 1): # 判断是否为素数 if num % i == 0: return False return True def is_palindrome(num): temp = str(num) return temp == temp[::-1] # 判断是否为回文数 def generate_palindromic_primes(n): count = 0 current = 2 result = [] while count < n: if is_prime(current) and is_palindrome(current): result.append(current) count += 1 current += 1 return result n = int(input("请输入一个正整数 n: ")) palindromic_primes = generate_palindromic_primes(n) print(" ".join(map(str, palindromic_primes))) ``` 上述代码通过`is_prime`函数判断一个数是否为素数[^4],并通过`is_palindrome`函数判断一个数是否为回文数[^2]。 --- #### 方法二:判断一个数是否为回文素数 以下代码实现了判断用户输入的一个数是否为回文素数的功能: ```python def is_prime(num): if num < 2: return False for i in range(2, int(num**0.5) + 1): # 判断是否为素数 if num % i == 0: return False return True def is_palindrome(num): temp = str(num) return temp == temp[::-1] # 判断是否为回文数 number = int(input("请输入一个整数: ")) if is_prime(number) and is_palindrome(number): print(f"{number} 是回文素数") else: print(f"{number} 不是回文素数") ``` 此代码同样利用了`is_prime``is_palindrome`两个辅助函数来完成判断[^2]。 --- ### 相关说明 - 素数的判断使用了优化算法,仅需检查到`sqrt(num)`即可。 - 回文数的判断通过字符串反转操作`[::-1]`实现,简洁高效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值