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,不让他生效,递归中,在他之前的质数就直接过掉,加快程序执行速度。

其他具体内容请参看代码吧,思路比较简单。



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