之前面試碰到過一道題,要求將整數分解為質數,用c實現看上去較為繁瑣,最近學習python,拿這道題練練手,相對於c而言,**非常簡潔。
廢話不多說,先上原始碼。
import time
def isnotin(meta , list):
for ec in list:
if meta==ec:
return false
return true
def getas(numlist,primelist,remander,cycleminpri):
m=0for ec in primelist:
if ec < cycleminpri:
continue
if remander%ec == 0 and remander != ec:
primelist=getas(numlist,primelist,int(remander/ec),ec)
return primelist
if isnotin(remander,primelist):
else:
return primelist
primelist=
for each_item in range(3,10000):
numlist=
primelist=getas(numlist,primelist,each_item,1)
if numlist:
str = "%d%s" % (each_item, " = ")
for ec in range(0,len(numlist)-1):
str="%s%d%s"%(str,numlist[ec],' x ')
str="%s%d"%(str,numlist[-1])
else:
str="%d%s"%(each_item,"是質數")
print(str)
這段**可用於獲取3到1000000之間所有整數分解質因數的結果,演算法的實現主要是用於遞迴的思想。
isnotin函式用於校驗某個元素是否存在於質數表中。
getas是我們要實現的遞迴函式:
四個引數numlist用於存放分解質因數後的得到的結果,
primelist是我們在迴圈過程中獲取到的質因數表
remander第一次傳入的是我們要分解的整數,在遞迴中傳入的是除以質因數後的餘數
cycleminpri 是取余時當前的質因數值,第一次傳入1,不讓他生效,遞迴中,在他之前的質數就直接過掉,加快程式執行速度。
其他具體內容請參看**吧,思路比較簡單。
合數分解為質數的乘積模板
includeusing namespace std define ll long long define inf 1000 ll num 200 cnt num記錄n的質數因子,cnt記錄個數 intmain if i inf break 當n是個大數,如果再乙個個列舉一定超時,但是對於大數而言,...
整數分解為若干項之和
將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7 6 1,7 5 2,7 5 1 1,程式設計求出正整數n的所有整數分解式子。輸入格式 每個輸入包含乙個測試用例,即正整數n 0輸出格式 按遞增順序輸出n的所有整數分解式子。遞增順序是指 對於兩個分解序列n 1 和n 2 若存在i使得n ...
整數分解為若干項之和
將乙個正整數n分解成幾個正整數相加,可以有多種分解方法,例如7 6 1,7 5 2,7 5 1 1,程式設計求出正整數n的所有整數分解式子。每個輸入包含乙個測試用例,即正整數n 0 30 按遞增順序輸出n的所有整數分解式子。遞增順序是指 對於兩個分解序列n 1 和n 2 若存在i使得n 1 m 1 ...