解決Python中回文數(shù)和質(zhì)數(shù)的問(wèn)題
一、前言
今天學(xué)習(xí)視頻時(shí)課后作業(yè)是找出1000以?xún)?nèi)既是素?cái)?shù)又是回文數(shù)的數(shù),寫(xiě)代碼這個(gè)很容易,結(jié)果一運(yùn)行遇到了bug,輸出結(jié)果跟預(yù)期不一樣,調(diào)試了快30min,再接著一通搜索和回看視頻才發(fā)現(xiàn)問(wèn)題所在。所以特地寫(xiě)下來(lái),方便以后查看。問(wèn)題的關(guān)鍵是判斷素?cái)?shù)過(guò)程中for…else的用法上(具體看后面代碼)
二、實(shí)現(xiàn)判斷素?cái)?shù)的功能
質(zhì)數(shù)(Prime number),又稱(chēng)素?cái)?shù),指在大于1的自然數(shù)中,除了1和該數(shù)自身外,無(wú)法被其他自然數(shù)整除的數(shù)(也可定義為只有1與該數(shù)本身兩個(gè)因數(shù)的數(shù))。via——Wikipedia
所以采用窮舉法只要在2~n-1的區(qū)間,沒(méi)有一個(gè)數(shù)能整除n,那么n就是素?cái)?shù)。
對(duì)2-n-1區(qū)間進(jìn)行合理優(yōu)化,假設(shè)x*y=n(x<=y),那么當(dāng)x和y相等時(shí),x有最大值。即x=y=sqrt(n),所以x的區(qū)間就可以限制為2~sqrt(n)+1。還有疑問(wèn),可以在再多想想,紙上算一算。
因?yàn)檫@里要用到sqrt()方法,所以需要導(dǎo)入math模塊。
不多說(shuō),直接上代碼:
# 求解1000以?xún)?nèi)的所有素?cái)?shù),正確版本 import math num = 2 count = 0 list_s = [] max_d = 1000 while num < max_d: length = int(math.sqrt(num)+1) # 對(duì)遍歷范圍進(jìn)行合理優(yōu)化 for i in range(2,length): # 注意從2開(kāi)始 if num % i == 0: break else: # 這里的else跟for對(duì)齊,而不是跟if,表示只有for順利執(zhí)行時(shí),else才執(zhí)行 count += 1 list_s.append(num) # 存入列表 num += 1 if count == 0: print(max_d,'以?xún)?nèi)沒(méi)有素?cái)?shù)') else: print(max_d,'以?xún)?nèi)的素?cái)?shù)有',count,'個(gè),分別是:',list_s)
輸出結(jié)果:

這個(gè)代碼完全沒(méi)有問(wèn)題,然后下面給出一個(gè)有問(wèn)題的代碼:
# 求解40以?xún)?nèi)的所有素?cái)?shù),錯(cuò)誤版本 import math num = 2 count = 0 list_s = [] max_d = 40 while num < max_d: length = int(math.sqrt(num)+1) # 對(duì)遍歷范圍進(jìn)行合理優(yōu)化 for i in range(2,length): # 注意從2開(kāi)始 if num % i == 0: break else: # 這里的else跟if對(duì)齊,會(huì)導(dǎo)致一個(gè)素?cái)?shù)會(huì)被寫(xiě)入int(math.sqrt(num))-1次,同時(shí)一些非素?cái)?shù)也會(huì)被當(dāng)做素?cái)?shù) count += 1 list_s.append(num) # 存入列表 num += 1 if count == 0: print(max_d,'以?xún)?nèi)沒(méi)有素?cái)?shù)') else: print(max_d,'以?xún)?nèi)的素?cái)?shù)有',count,'個(gè),分別是:',list_s)
輸出結(jié)果:

所以,一定要認(rèn)真對(duì)待循環(huán)中else對(duì)齊問(wèn)題。這個(gè)在解決素?cái)?shù)問(wèn)題中很重要。小結(jié)一下while…else和for…else
只有循環(huán)完所有次數(shù),才會(huì)執(zhí)行 else ,循環(huán)體中有continue存在,也不影響else執(zhí)行。
一旦循環(huán)體中觸發(fā)了break ,就會(huì)阻止 else 語(yǔ)句塊的執(zhí)行。
三、實(shí)現(xiàn)判斷回文數(shù)的功能
回文數(shù)即從左到右和從右到左一樣。如:12321。
方法:
把已知的num1數(shù)反過(guò)來(lái),得到num2,如123變?yōu)?21,采用//10 %10 *10等運(yùn)算操作,其中還要借助一個(gè)臨時(shí)變量tmp
判斷如果num1 == num 2,則num1是回文數(shù),反之不是
代碼如下:
# 求解1000以?xún)?nèi)的所有回文數(shù) num = 0 # 這里num從0開(kāi)始 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,'以?xún)?nèi)沒(méi)有回文數(shù)') else: print(max_d,'以?xún)?nèi)的回文數(shù)有',count,'個(gè),分別是:',list_h)
更新:對(duì)于判斷回文數(shù)或者回文字符串,采用雙端隊(duì)列的數(shù)據(jù)結(jié)構(gòu),會(huì)非常簡(jiǎn)單。實(shí)現(xiàn)如下:
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=',')
四、實(shí)現(xiàn)同時(shí)判斷回文數(shù)和質(zhì)數(shù)
需要選擇是否嵌套以及先判斷回文還是先判斷素?cái)?shù),所以又四個(gè)版本。大家可以自己思考每個(gè)版本的性能上有無(wú)區(qū)別,占用空間有無(wú)區(qū)別。因?yàn)槲乙矝](méi)有太想明白,所以沒(méi)有放上來(lái)。
我寫(xiě)了四個(gè)版本,都能實(shí)現(xiàn)需求。不過(guò)從性能上,在我測(cè)試的100-1000000區(qū)間,采用嵌套的先求解回文再判斷素?cái)?shù)要快一些。
不多說(shuō),四個(gè)版本的代碼全部在寫(xiě)下面,可以自行刪掉相應(yīng)的'''標(biāo)記進(jìn)行測(cè)試。
'''
# 版本一、求1000以?xún)?nèi)的回文素?cái)?shù),多層嵌套,先求素?cái)?shù)后回文數(shù)
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,'以?xún)?nèi)的素?cái)?shù)有:',list_s)
if count == 0:
print(max_d,'以?xún)?nèi)沒(méi)有既是素?cái)?shù)又是回文數(shù)的數(shù)')
else:
print(max_d,'以?xún)?nèi)既是素?cái)?shù)又是回文數(shù)的數(shù)有',count,'個(gè),分別是:',list_sh)
'''
'''
# 版本二、求1000以?xún)?nèi)的回文素?cái)?shù),多層嵌套,先求回文數(shù)后求素?cái)?shù)
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,'以?xún)?nèi)的素?cái)?shù)有:',list_h)
if count == 0:
print(max_d,'以?xún)?nèi)沒(méi)有既是素?cái)?shù)又是回文數(shù)的數(shù)')
else:
print(max_d,'以?xún)?nèi)既是素?cái)?shù)又是回文數(shù)的數(shù)有',count,'個(gè),分別是:',list_hs)
'''
'''
# 版本三、求1000以?xún)?nèi)的回文素?cái)?shù),先求素?cái)?shù)再求回文數(shù)
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對(duì)齊
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,'以?xún)?nèi)的素?cái)?shù)有:',list_s)
if count == 0:
print(max_d,'以?xún)?nèi)沒(méi)有既是素?cái)?shù)又是回文數(shù)的數(shù)')
else:
print(max_d,'以?xún)?nèi)既是素?cái)?shù)又是回文數(shù)的數(shù)有',count,'個(gè),分別是:',list_sh)
'''
'''
# 版本四、求1000以?xún)?nèi)的回文素?cái)?shù),先求回文數(shù),再求素?cái)?shù)
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對(duì)齊
list_sh.append(hn)
count += 1
print(max_d,'以?xún)?nèi)的回文數(shù)有:',list_h)
if count == 0:
print(max_d,'以?xún)?nèi)沒(méi)有既是素?cái)?shù)又是回文數(shù)的數(shù)')
else:
print(max_d,'以?xún)?nèi)既是素?cái)?shù)又是回文數(shù)的數(shù)有',count,'個(gè),分別是:',list_sh)
'''
五、總結(jié)
這個(gè)過(guò)程幫助自己更加深刻的理解了if…elif…else 、for…else和while…else以后使用時(shí)會(huì)更加注意。
以上這篇解決Python中回文數(shù)和質(zhì)數(shù)的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 利用Python計(jì)算質(zhì)數(shù)與完全數(shù)的方法實(shí)例
- python中判斷數(shù)字是否為質(zhì)數(shù)的實(shí)例講解
- Python 2種方法求某個(gè)范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù))
- python求質(zhì)數(shù)列表的例子
- python求質(zhì)數(shù)的3種方法
- python輸出100以?xún)?nèi)的質(zhì)數(shù)與合數(shù)實(shí)例代碼
- Python編程求質(zhì)數(shù)實(shí)例代碼
- Python 判斷是否為質(zhì)數(shù)或素?cái)?shù)的實(shí)例
- 使用Python判斷質(zhì)數(shù)(素?cái)?shù))的簡(jiǎn)單方法講解
- python實(shí)現(xiàn)挑選出來(lái)100以?xún)?nèi)的質(zhì)數(shù)
- python計(jì)算質(zhì)數(shù)的6種方法
相關(guān)文章
Python的numpy庫(kù)下的幾個(gè)小函數(shù)的用法(小結(jié))
這篇文章主要介紹了Python的numpy庫(kù)下的幾個(gè)小函數(shù)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python函數(shù)的周期性執(zhí)行實(shí)現(xiàn)方法
這篇文章主要介紹了Python函數(shù)的周期性執(zhí)行實(shí)現(xiàn)方法,涉及Python使用sched模塊實(shí)現(xiàn)函數(shù)周期性調(diào)度觸發(fā)的相關(guān)技巧,需要的朋友可以參考下2016-08-08
Django零基礎(chǔ)入門(mén)之調(diào)用漂亮的HTML前端頁(yè)面
這篇文章主要介紹了Django零基礎(chǔ)入門(mén)之調(diào)用漂亮的HTML前端頁(yè)面的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
深入淺析NumPy庫(kù)中的numpy.diag()函數(shù)
通過(guò)本文的介紹,我們深入了解了NumPy庫(kù)中numpy.diag()函數(shù)的用法和應(yīng)用,從基本用法到高級(jí)特性,再到在線(xiàn)性代數(shù)中的應(yīng)用,我們逐步展示了numpy.diag()在處理對(duì)角矩陣和相關(guān)問(wèn)題時(shí)的強(qiáng)大功能,需要的朋友可以參考下2024-05-05
python json.dumps中文亂碼問(wèn)題解決
這篇文章主要介紹了python json.dumps中文亂碼問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python實(shí)現(xiàn)端口檢測(cè)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)端口檢測(cè)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Python實(shí)現(xiàn)獲取當(dāng)前目錄下文件名代碼詳解
這篇文章主要介紹了Python實(shí)現(xiàn)獲取當(dāng)前目錄下文件名,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python隨機(jī)生成信用卡卡號(hào)的實(shí)現(xiàn)方法
這篇文章主要介紹了Python隨機(jī)生成信用卡卡號(hào)的實(shí)現(xiàn)方法,可實(shí)現(xiàn)生成信用卡卡號(hào)的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
python3簡(jiǎn)單實(shí)現(xiàn)微信爬蟲(chóng)
我們可以通過(guò)python 來(lái)實(shí)現(xiàn)這樣一個(gè)簡(jiǎn)單的爬蟲(chóng)功能,把我們想要的代碼爬取到本地。下面就看看如何使用python來(lái)實(shí)現(xiàn)這樣一個(gè)功能。2015-04-04

