python實現整數分解爲質數的算法

之前面試碰到過一道題,要求將整數分解爲質數,用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=0
    for ec in primelist:
        if ec < cycleminpri:
            continue
        if remander%ec == 0 and remander != ec:
            numlist.append(ec)
            primelist=getas(numlist,primelist,int(remander/ec),ec)
            return primelist
    if isnotin(remander,primelist):
        primelist.append(remander)
    else:
        numlist.append(remander)
    return primelist

primelist=[]
primelist.append(2)

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之間所有整數分解質因數的結果,算法的實現主要是用於遞歸的思想。

要獲取質因數,首先我們要獲取質數表,當然,爲了效率起見,定義了primelist這樣一個list,用於存放獲取到的所有質數。這裏便體現出了python相對於c來實現算法的優勢,這個primelist無需定義大小,省去了內存分配的環節,擴展性也好於c的數組,可以通過append接口直接往後添加元素。有了這個primelist之後,我們可以直接把獲取到的質數添加進去,分解質因數的同時擴充質數表。

isnotin函數用於校驗某個元素是否存在於質數表中。

getas是我們要實現的遞歸函數:

四個參數numlist用於存放分解質因數後的得到的結果,

primelist是我們在循環過程中獲取到的質因數表

remander第一次傳入的是我們要分解的整數,在遞歸中傳入的是除以質因數後的餘數

cycleminpri 是取餘時當前的質因數值,第一次傳入1,不讓他生效,遞歸中,在他之前的質數就直接過掉,加快程序執行速度。

其他具體內容請參看代碼吧,思路比較簡單。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章