之前面试碰到过一道题,要求将整数分解为质数,用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,不让他生效,递归中,在他之前的质数就直接过掉,加快程序执行速度。
其他具体内容请参看代码吧,思路比较简单。