Python算法100例-3.1 回文數

完整源代碼項目地址,關注博主私信'源代碼'后可獲取

  • 1.問題描述
  • 2.問題分析
  • 3.算法設計
  • 4.確定程序框架
  • 5.完整的程序
  • 6.問題拓展
  • 7.巧用字符串技巧

1.問題描述

打印所有不超過n(取n<256)的其平方具有對稱性質的數(也稱回文數)。

2.問題分析

對于要判定的數n,計算出其平方后(存于a),按照“回文數”的定義要將最高位與最低位、次高位與次低位等進行比較,若彼此相等則為回文數。此算法需要知道平方數的位數,再一一將每一位分解并比較,此方法對于位數已知且位數不是太多的數來說比較適用。

此問題可借助數組來解決。將平方后的數值(a)的每一位進行分解,按從低位到高位的順序依次暫存到數組中,再將數組中的元素按照下標從大到小的順序重新將其組合成一個數k(如n=15,則a=225且k=522),若a等于k則可判定n為回文數。

3.算法設計

從低位到高位將某個整數拆分。對于一個整數(設變量名為a),無論其位數多少,若欲將最低位拆分則只需對10進行求模運算,即a%10;拆分次低位首先要想辦法將原來的次低位作為最低位來處理,用原數對10求商可得到由除最低位之外的數形成的新數,且新數的最低位是原數的次低位,根據拆分最低位的方法將次低位求出,即先進行a//10運算,后進行a%10運算;對于其他位上的數算法相同。利用這個方法要解決的一個問題是,什么情況下才算把所有數都拆分完了呢?當拆分到只剩原數最高位時(即新數為個位數時),再對10求商的話,得到的結果肯定為0,可通過這個條件判斷是否拆分完畢。根據題意,應將每次拆分出來的數據存儲到數組中,原數的最低位存到下標為0的位置,次低位存到下標為1的位置,以此類推。程序段如下:

i = 0
while a != 0:                           # 從低位到高位分解數a的每一位,存于數組m[1]~m[16]m[i] = a % 10a //= 10i += 1

將數組中元素重新組合成一個新數。拆分時變量a的最高位仍然存儲在數組中下標最大的位置,根據“回文數”定義,新數中數據的順序與a中數據的順序相反,所以我們按照下標從大到小的順序分別取出數組中的元素組成新數k。由幾個數字組成一個新數時只需用每一個數字乘以所在位置對應的權值,然后相加即可,在編程過程中應該有一個變量t來存儲每一位對應的權值,個位權值為1,十位權值為10,百位權值為100,以此類推,所以可以利用循環,每循環一次,t的值就擴大10倍。對應的程序段如下:

while i > 0:k += m[i-1] * t # t記錄某一位置對應的權值t *= 10i -= 1

4.確定程序框架

程序的流程圖如圖所示。

在這里插入圖片描述

5.完整的程序

%%time
# 回文數if __name__ == '__main__':m = [1] * 17count = 0print("No.    number     it's square(palindrome)")for n in range(1, 256):                                 # 窮舉n的取值范圍k, i, t, a = 0, 0, 1, n*n                   # 計算n的平方squ = awhile a != 0:                       # 從低到高分解數a的每一位存于數組m[1]~m[16]m[i] = a % 10a //= 10i += 1while i > 0:k += m[i-1] * t         # t記錄某一位置對應的權值t *= 10i -= 1if k == squ:count += 1print("%2d%10d%10d" % (count, n, n*n))
No.    number     it's square(palindrome)1         1         12         2         43         3         94        11       1215        22       4846        26       6767       101     102018       111     123219       121     14641
10       202     40804
11       212     44944
CPU times: user 2.72 ms, sys: 0 ns, total: 2.72 ms
Wall time: 1.99 ms

6.問題拓展

在上面的問題分析中,提到另一種判斷“回文數”的方法,就是將數據中每一位的數分離出來,然后比較對稱位置上的數據,若相等,則此數是“回文數”。此方法適合于對一個整數進行判斷。

編程實現輸入一個5位數,判斷它是不是回文數,例如12321是回文數,個位與萬位相同,十位與千位相同。

完整的程序如下:

%%time
# 回文數判斷if __name__ == '__main__':x = int(input("請輸入一個5位數整數:"))if x < 10000 or x > 99999:print("輸入錯誤")else:ten_thousand = x // 10000                                   #拆分最高位萬位thousand = x % 10000 // 1000                        #拆分千位ten = x % 100 // 10                                         #拆分十位indiv = x % 10                                                      #拆分個位if indiv == ten_thousand and ten == thousand:print("%d是回文數" %x)else:print("%d不是回文數" %x)
12321是回文數
CPU times: user 60.4 ms, sys: 11.3 ms, total: 71.7 ms
Wall time: 5.86 s

對于本題來說,給定的是一個5位數,對于中間位置的百位不需要再進行分離,因為它不與任何其他位置進行比較。但對偶數位的整數進行判斷時,所有位置都要分離出來。在編程過程中除了保證程序的正確性外,效率也是很重要的。

7.巧用字符串技巧

本題編程只涉及整數回文數判斷,所以可以將整數轉換成字符串,再使用字符串的切片函數實現倒序,在判斷兩個字符串是否相等即可。

具體代碼如下:

a=12321
str_a=str(a)
str_a_reversed=str_a[::-1]
str_a_reversed
str_a==str_a_reversed
True
%%time
# 巧用字符串判斷回文數
if __name__ == '__main__':m = [1] * 17count = 0print("No.    number     it's square(palindrome)")for n in range(1, 256):                                 # 窮舉n的取值范圍m=pow(n,2)str_m=str(m)str_m_reversed=str_m[::-1]if str_m==str_m_reversed:count += 1print("%2d%10d%10d" % (count, n, n*n))
No.    number     it's square(palindrome)1         1         12         2         43         3         94        11       1215        22       4846        26       6767       101     102018       111     123219       121     14641
10       202     40804
11       212     44944
CPU times: user 509 μs, sys: 0 ns, total: 509 μs
Wall time: 493 μs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在國內如何申請US,visa卡?

隨著跨境與AI的發展大家對美國虛擬卡的需求也越來越多&#xff0c;比如說亞馬遜、ebay、Etsy、ChatGPTPLUS、midjourney、POE等等軟件以及海淘的需要&#xff0c;所以我們需要用到美國虛擬卡的場景就越來越多 如何獲得一張US 虛擬信用卡&#xff1f; 方法很簡單&#xff0c;點…

一線大廠軟件測試面試題及答案解析,2024最強版...

【軟件測試面試突擊班】2024吃透軟件測試面試最全八股文攻略教程&#xff0c;一周學完讓你面試通過率提高90%&#xff01;&#xff08;自動化測試&#xff09; 1、什么是兼容性測試?兼容性測試側重哪些方面? 參考答案: 兼容測試主要是檢查軟件在不同的硬件平臺、軟件平臺上…

CNAN知識圖譜輔助推薦系統

CNAN知識圖譜輔助推薦系統 文章介紹了一個基于KG的推薦系統模型&#xff0c;代碼也已開源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介紹 算法除去attention機制外&#xff0c;主要的思想在于&#xff1a;user由交互過的item來表示、i…

OpenShift AI - 部署并使用 LLM 模型

《OpenShift / RHEL / DevSecOps 匯總目錄》 說明&#xff1a;本文已經在 OpenShift 4.15 RHODS 2.7.0 的環境中驗證 文章目錄 安裝 OpenShift AI 環境安裝 Minio 對象存儲軟件配置 Single Model Serving 運行環境創建項目和 Workbench準備模型和配置 Model Server訪問 LLM 模…

arm-linux-gnueabi、arm-linux-gnueabihf 交叉編譯器區別

1、arm-linux-gnueabi&#xff1a; 使用軟件浮點&#xff08;軟浮點&#xff09;。這意味著所有的浮點運算都將由軟件庫來處理&#xff0c;而不會利用硬件中的浮點運算單元。因此&#xff0c;生成的目標代碼包含了對軟件浮點庫的調用。 2、arm-linux-gnueabihf&#xff1a; 使…

c++八股文:c++新特性

文章目錄 [toc] 1.C11的新特性有哪些2.智能指針3.類型推導4.左值和右值5.nullptr6.范圍for循環7.lambda表達式參考 1.C11的新特性有哪些 語法的改進 &#xff08;1&#xff09;統?的初始化?法 &#xff08;2&#xff09;成員變量默認初始化 &#xff08;3&#xff09;auto關…

mybatis中#{}和${}的區別?

#{}是占位符&#xff0c;預編譯處理&#xff1b;${}是拼接符&#xff0c;字符串替換&#xff0c;沒有預編譯處理。 Mybatis在處理#{}時&#xff0c;#{}傳入參數是以字符串傳入&#xff0c;會將SQL中的#{}替換為?號&#xff0c;調用PreparedStatement的set方法來賦值。 Mybat…

DCTNet

DCTNet http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E9%A2%91%E5%9F%9F%E4%B8%AD%E7%9A%84CNN/CVPR%202020%20%E5%9C%A8%E9%A2%91%E5%9F%9F%E4%B8%AD%E5%AD%A6%E4%B9%A0%E7%9A%84DCTNet/ 一個對輸入圖像進行頻域轉換和選擇的方法&#xff0c;達到…

python實現手機號歸屬地查詢

手機上突然收到了某銀行的短信提示&#xff0c;看了一下手機的位數&#xff0c;正好是11位。我一想&#xff0c;這不就是標準的手機號碼嗎&#xff1f;于是一個想法涌上心頭——用python的庫實現查詢手機號碼歸屬地查詢自由。 那實現的效果如下&#xff1a; 注&#xff1a;電…

達夢數據庫基礎操作(一):用戶操作

達夢數據庫基礎操作(一)&#xff1a;用戶操作 1 達夢運行狀態 SELECT banner as 版本信息 FROM v$version;1.2 達夢版本號 SELECT banner as 版本信息 FROM v$version;1.3 用戶相關操作 默認用戶名密碼&#xff1a;SYSDBA/SYSDBA 注意&#xff1a;在哪個數據庫下創建的用戶…

2.3_3 進程互斥的硬件實現方法

文章目錄 2.3_3 進程互斥的硬件實現方法&#xff08;一&#xff09;中斷屏蔽方法&#xff08;二&#xff09;TestAndSet指令&#xff08;三&#xff09;Swap指令 總結&#xff08;四&#xff09;互斥鎖 2.3_3 進程互斥的硬件實現方法 學習提示&#xff1a; 1.理解各方法的原理 …

寶塔Linux面板遷移網站數據的詳細步驟是什么?

寶塔Linux面板遷移網站數據的詳細步驟是什么&#xff1f; 準備工作&#xff1a;確保寶塔面板處于最新版本并與服務器環境一致。如果需要遷移到其他機器&#xff0c;需要將遷入服務器的寶塔面板信息和API秘鑰填寫好。秘鑰的有效期為7天&#xff0c;建議在使用后手動關閉接口以保…

Python從0到100(二):Python語言介紹及第一個Pyhon程序

前言&#xff1a; 零基礎學Python&#xff1a;Python從0到100最新最全教程。 想做這件事情很久了&#xff0c;這次我更新了自己所寫過的所有博客&#xff0c;匯集成了Python從0到100&#xff0c;共一百節課&#xff0c;幫助大家一個月時間里從零基礎到學習Python基礎語法、Pyth…

springcloud:3.3測試重試機制

服務提供者【test-provider8001】 Openfeign遠程調用服務提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相關接口 測試遠程調用&#xff1a;http://localhost:8001/payment/index 服務消費者【test-consumer-resilience4j8004】 Openfeign遠程調用消費者搭建 文章地址http:/…

Vue 3 中如何使用全局 API?

Vue 3 中的全局 API 使用詳解 Vue 3 相較于 Vue 2 在全局 API 的使用上有了較大的變化。Vue 3 引入了新的全局 API 創建方式&#xff0c;并通過 createApp 方法替代了 Vue 2 中的 new Vue()。這種變化使得 Vue 3 在全局 API 的使用上更加靈活&#xff0c;也更好地支持了 tree-…

UNIapp實現局域網內在線升級

首先是UNIapp 生成apk 用Hbuilder 進行打包 可以從網站https://www.yunedit.com/reg?gotocert 使用自有證書&#xff0c;目測比直接使用云證書要快一些。 發布apk 網站 用IIS發布即可 注意事項中記錄如下內容 第一、需要在 iis 的MiMe 中添加apk 的格式&#xff0c;否則無法…

如何本地創建websocket服務端并發布到公網實現遠程訪問

文章目錄 1. Java 服務端demo環境2. 在pom文件引入第三包封裝的netty框架maven坐標3. 創建服務端,以接口模式調用,方便外部調用4. 啟動服務,出現以下信息表示啟動成功,暴露端口默認99995. 創建隧道映射內網端口6. 查看狀態->在線隧道,復制所創建隧道的公網地址加端口號7. 以…

如何實現飛書與金蝶無縫對接,提升業務效率與客戶滿意度?

一、客戶介紹 某貿易有限公司是一家專業從事進口葡萄酒和高端烈酒銷售的企業。在市場競爭日益激烈的今天&#xff0c;該公司始終堅持以客戶為中心&#xff0c;以市場為導向&#xff0c;不斷創新和進步。公司不僅注重傳統銷售渠道的拓展&#xff0c;還積極擁抱互聯網&#xff0…

processing繪制笑臉

笑臉效果圖&#xff1a; processing代碼&#xff1a; void setup(){size(1000,1000);//Canvas sizebackground(#ffcc33);//Canvas background color } void draw(){ strokeWeight(12);//face-width12px fill(#ffffcc);//face arc(500,500,200,200,0,TWO_PI);//face-size strok…

Python中的自然語言處理和文本挖掘

在Python中&#xff0c;自然語言處理&#xff08;NLP&#xff09;和文本挖掘通常涉及對文本數據進行清洗、轉換、分析和提取有用信息的過程。Python有許多庫和工具可以幫助我們完成這些任務&#xff0c;其中最常用的包括nltk&#xff08;自然語言處理工具包&#xff09;、spaCy…