欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Python中回文數和質數的問題

 更新時間:2019年11月24日 10:08:42   作者:Jock2018  
今天小編就為大家分享一篇解決Python中回文數和質數的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、前言

今天學習視頻時課后作業(yè)是找出1000以內既是素數又是回文數的數,寫代碼這個很容易,結果一運行遇到了bug,輸出結果跟預期不一樣,調試了快30min,再接著一通搜索和回看視頻才發(fā)現問題所在。所以特地寫下來,方便以后查看。問題的關鍵是判斷素數過程中for…else的用法上(具體看后面代碼)

二、實現判斷素數的功能

質數(Prime number),又稱素數,指在大于1的自然數中,除了1和該數自身外,無法被其他自然數整除的數(也可定義為只有1與該數本身兩個因數的數)。via——Wikipedia

所以采用窮舉法只要在2~n-1的區(qū)間,沒有一個數能整除n,那么n就是素數。

對2-n-1區(qū)間進行合理優(yōu)化,假設x*y=n(x<=y),那么當x和y相等時,x有最大值。即x=y=sqrt(n),所以x的區(qū)間就可以限制為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) # 對遍歷范圍進行合理優(yōu)化
 for i in range(2,length): # 注意從2開始
  if num % i == 0:
   break
 else: # 這里的else跟for對齊,而不是跟if,表示只有for順利執(zhí)行時,else才執(zhí)行
  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) # 對遍歷范圍進行合理優(yōu)化
 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)

輸出結果:

所以,一定要認真對待循環(huán)中else對齊問題。這個在解決素數問題中很重要。小結一下while…else和for…else

只有循環(huán)完所有次數,才會執(zhí)行 else ,循環(huán)體中有continue存在,也不影響else執(zhí)行。

一旦循環(huán)體中觸發(fā)了break ,就會阻止 else 語句塊的執(zhí)行。

三、實現判斷回文數的功能

回文數即從左到右和從右到左一樣。如:12321。

方法:

把已知的num1數反過來,得到num2,如123變?yōu)?21,采用//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=',')

四、實現同時判斷回文數和質數

需要選擇是否嵌套以及先判斷回文還是先判斷素數,所以又四個版本。大家可以自己思考每個版本的性能上有無區(qū)別,占用空間有無區(qū)別。因為我也沒有太想明白,所以沒有放上來。

我寫了四個版本,都能實現需求。不過從性能上,在我測試的100-1000000區(qū)間,采用嵌套的先求解回文再判斷素數要快一些。

不多說,四個版本的代碼全部在寫下面,可以自行刪掉相應的'''標記進行測試。

'''
# 版本一、求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 sqlalchemy動態(tài)修改tablename兩種實現方式

    python sqlalchemy動態(tài)修改tablename兩種實現方式

    這篇文章主要介紹了python sqlalchemy動態(tài)修改tablename兩種實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • Flask-Docs自動生成Api文檔安裝使用教程

    Flask-Docs自動生成Api文檔安裝使用教程

    這篇文章主要為大家介紹了Flask-Docs自動生成Api文檔安裝使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 安裝完Python包然后找不到模塊的解決步驟

    安裝完Python包然后找不到模塊的解決步驟

    今天小編就為大家分享一篇安裝完Python包然后找不到模塊的解決步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python比較兩個列表大小的方法

    python比較兩個列表大小的方法

    這篇文章主要介紹了python比較兩個列表大小的方法,涉及Python針對列表的相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Python+Turtle繪制可愛的可達鴨

    Python+Turtle繪制可愛的可達鴨

    一年一度的六一兒童節(jié)又來了,祝大朋友小朋友節(jié)日快樂!本文主要介紹如何運用Python中的turtle庫控制函數繪制可達鴨,希望你會喜歡
    2022-05-05
  • Python?如何實現批量轉換視頻音頻的采樣率

    Python?如何實現批量轉換視頻音頻的采樣率

    這篇文章主要分享一個python代碼,可以將多個視頻中的音頻轉化為相同采樣率的視頻,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2021-11-11
  • python可視化分析的實現(matplotlib、seaborn、ggplot2)

    python可視化分析的實現(matplotlib、seaborn、ggplot2)

    這篇文章主要介紹了python可視化分析的實現(matplotlib、seaborn、ggplot2),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Python numpy大矩陣運算內存不足如何解決

    Python numpy大矩陣運算內存不足如何解決

    這篇文章主要介紹了Python numpy大矩陣運算內存不足如何解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 用Python代碼自動生成文獻的IEEE引用格式的實現

    用Python代碼自動生成文獻的IEEE引用格式的實現

    這篇文章主要介紹了用Python代碼自動生成文獻的IEEE引用格式的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 刪除pycharm鼠標右鍵快捷鍵打開項目的操作

    刪除pycharm鼠標右鍵快捷鍵打開項目的操作

    這篇文章主要介紹了刪除pycharm鼠標右鍵快捷鍵打開項目的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論