Python中的完美數字程序:如何檢查一個數字是否完美?

已發表: 2021-01-29

介紹

如果一個數的真除數(不包括該數本身)之和等於該數,則稱該數為完美數。

為了更好地理解,讓我們考慮一個例子,6 的正確除數是 1、2、3。現在這些除數之和等於 6(1+2+3=6),所以 6 被稱為完美數. 而如果我們考慮另一個像 12 這樣的數字,12 的正確除數是 1、2、3、4、6。現在這些除數的總和不等於 12,所以 12 不是一個完美的數字。

與其他語言相比,Python 編程相對更簡單、更有趣,因為它的語法更簡單,可讀性好。 現在我們已經清楚了完美數的概念,讓我們編寫一個 python 程序來檢查一個數字是否是一個完美數。 讓我們構建一個 python 代碼來檢查給定的用戶輸入是否是一個完美的數字,並探索使用 python 編碼的樂趣。 如果您有興趣獲得專業知識,請查看我們的數據科學計劃。

閱讀: Python 模式程序

目錄

Python程序

找到完美數的基本解決方案是將 2 循環到 number-1,保持其適當除數的總和,並檢查總和是否等於該數。

n=int(input(“輸入數字”))
總和=1
對於範圍內的 i (2,n):
如果(n%i==0):
總和=總和+我
如果(總和==n):
print(n,"是一個完美數")
別的:
print(n,"不是一個完美的數字")

讓我們看一下代碼。

我們首先使用用戶輸入初始化 n 並將其類型轉換為整數,因為默認情況下,用戶輸入在 python 中被讀取為字符串。 我們需要檢查 n 是否為完美數。 請注意,我們用 1 初始化和,因為 1 是所有整數(不包括零)的適當除數,因此我們可以排除循環中的迭代並直接從 2 開始。

我們將 2 循環到 number-1 並將整數添加到 sum 如果它是一個適當的除數。 最後,當我們退出循環時,我們正在檢查獲得的總和是否等於數字。 小菜一碟吧?

小優化版

在對上面的程序進行了試運行之後,我們可能會有一個問題,我們可以優化它嗎? 好吧,但是我們可以在不改變算法的情況下將迭代次數減少到 number/2。 因為我們知道一個數不能有一個大於 number/2 的除數。

n=int(input(“輸入數字”))
總和=1
對於範圍內的 i (2,n//2+1):
如果(n%i==0):
總和=總和+我
如果(總和==n):
print(n,"是一個完美數")
別的:
print(n, “不是一個完美的數字”)

上面的代碼片段幾乎與前面的代碼片段相似,唯一的區別是循環到 number/2。 請注意,我們正在執行整數除法以避免將其轉換為浮點類型,並且我們正在循環直到 n//2+1,因為在 python 循環中不考慮範圍中的最後一個整數。

限制

當我們被要求找到給定範圍內的完美數字時,我們的解決方案將消耗與 number^2 成正比的時間,即 O(n²) 時間複雜度。 因為我們需要遍歷給定範圍內的每個數字,然後檢查每個數字的正確除數。 並且很少有數字滿足完美數字條件。 例如,0 到 1000 範圍內的完美數只有 3(6、28、496)。

有一個優化的解決方案,我們不需要遍歷所有元素來找到適當的除數,歐幾里得公式指出 2 n -1(2 n - 1) 是一個偶數完美數,其中 n,(2 n - 1) 都是質數。 例如,6 滿足上述方程,其中 n 為 2,並且 2, 2 2 - 1 (2 2 - 1 = 3) 都是素數。 但是如果我們被要求找出是否有任何奇完美數,我們無法回答。

此外,我們知道每種語言對其可以存儲的整數範圍都有限制。 有了這個限制,我們可能無法找到最大的完美數。

如果我們的輸入數量很大,所有這些限制都會面臨,但如果我們的輸入數量很小,那麼我們的初始解決方案將在更短的時間內起作用。

另請閱讀:用於 Web 開發的 Python 框架

結論

我們已經知道了定義並理解了完美數字背後的概念。 演練了查找數字的基本解決方案是否是完美數字。 在觀看了最初的解決方案之後,我們通過減少迭代次數對其進行了一些優化。 我們已經克服了我們算法的局限性,並討論了歐幾里得尋找偶數完美數的公式。

現在您已經了解了用於檢查數字是否為完美數字的 python 程序。 嘗試自己編寫代碼,如果發現任何重疊的迭代,請嘗試對其進行優化。 此外,嘗試構建代碼以在給定的數字範圍內查找完美數字。

如果您想了解 Python、數據科學,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃是為在職專業人士創建的,並提供 10 多個案例研究和項目、實用的實踐研討會、與行業專家的指導,與行業導師一對一,400 多個小時的學習和頂級公司的工作協助。

解釋 Python 中完美數字程序的複雜性。

如果一個數等於其除數之和,則稱該數為完美數。 要檢查一個數字是否完美,我們有兩種方法。 第一種方法是一種簡單的方法,其時間複雜度為 O(n2),因為我們為每個“i”迭代“j”次並檢查其除數。
第二種方法是時間複雜度為 O(√n) 的優化解決方案。 在這裡,我們不需要遍歷每個數字。 我們可以使用歐幾里得公式直接得出結論:
2n−1(2n − 1),其中 n 和 2n 是素數。
然而,這個公式不適用於奇完美數,因此,我們必須為它們找到另一種方法。

完美數字計劃方法的局限性是什麼?

這兩種方法都很好,但只是在一定程度上。 由於某些技術性,它們都不能被認為是完美的方法。 這些方法的局限性如下:

1. 第一種也是樸素的方法更糟糕,因為它消耗大量的時間和內存,並且時間複雜度為 O(n2)。 這是因為我們使用了一個嵌套循環,並為外循環的每個元素迭代內循環 n 次。 這種方法是幼稚的,並且會為較大的 n 值提供 TLE,因此不推薦。
2. 然後我們有一個優化的方法來解決 O(√n) 中的問題。 這是一個很好的方法,除非奇完美數發揮作用。 我們不能用這種方法檢查奇完美數,因為它基於“歐幾里得偶完美數公式”,它只適用於偶完美數。

Python 適合競技編程嗎?

Python 從 C/C++ 甚至 Java 演變而來,被認為是最適合研究和開發目的的語言。 但是當談到競爭性編程時,大多數編程社區都避免使用 Python。 原因在於 Python 是這三種語言中最慢的。