Python 中判斷一個數是否為特洛伊數
假設我們有一個數字 n,我們需要檢查 n 是否為特洛伊數。特洛伊數是一個強數,但不是完全冪。當 n 的每個素因子 p,p² 也是其因子時,n 為強數。換句話說,每個素因子至少出現兩次。特洛伊數是強數,但反之不然。這意味著,並非所有強數都是特洛伊數:只有那些不能表示為 a^b 的數才是特洛伊數。
因此,如果輸入是 72,則輸出為 True,因為 72 可以表示為 (6*6*2) = (6² * 2)。它是強數,但不是完全冪。
為了解決這個問題,我們將遵循以下步驟:
- 定義函式 `check_perfect_pow()`。它將接收 n 作為引數。
- 如果 n 等於 1,則
- 返回 True
- 對於 x 從 2 到 ⌊√n⌋ + 1,執行迴圈:
- y := 2
- p = x^y
- 當 p <= n 且 p > 0 時,執行迴圈:
- 如果 p 等於 n,則
- 返回 True
- y := y + 1
- p = x^y
- 如果 p 等於 n,則
- 返回 False
- 定義函式 `check_strong_num()`。它將接收 n 作為引數。
- count := 一個儲存數字頻率的對映,初始值都為 0。
- 當 n mod 2 等於 0 時,執行迴圈:
- n := n / 2 (整數除法)
- count[2] := count[2] + 1
- 對於 i 從 3 到 ⌊√n⌋ + 1,步長為 2,執行迴圈:
- 當 n mod i 等於 0 時,執行迴圈:
- n := n / i (整數除法)
- count[i] := count[i] + 1
- 當 n mod i 等於 0 時,執行迴圈:
- 如果 n > 2 且不為零,則
- count[n] := count[n] + 1
- flag := 0
- 對於 count 的每個鍵值對,執行迴圈:
- 如果 value 等於 1,則
- flag := 1
- 中斷迴圈
- 如果 value 等於 1,則
- 如果 flag 等於 1,則
- 返回 False
- 返回 True
- 在主方法中執行以下操作:
- 當 `check_perfect_pow(n)` 為 False 且 `check_strong_num(n)` 為 True 時返回 True,否則返回 False。
示例
讓我們看下面的實現來更好地理解:
from math import sqrt, pow
def check_perfect_pow(n):
if n == 1:
return True
for x in range(2, int(sqrt(n)) + 1):
y = 2
p = x**y
while p <= n and p > 0:
if p == n:
return True
y += 1
p = x**y
return False
def check_strong_num(n):
count = {i:0 for i in range(n)}
while n % 2 == 0:
n = n // 2
count[2] += 1
for i in range(3,int(sqrt(n)) + 1, 2):
while n % i == 0:
n = n // i
count[i] += 1
if n > 2:
count[n] += 1
flag = 0
for key,value in count.items():
if value == 1:
flag = 1
break
if flag == 1:
return False
return True
def isTrojan(n):
return check_perfect_pow(n) == False and check_strong_num(n)
n = 72
print(isTrojan(n))輸入
72
輸出
True
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP