Python实现将一个正整数分解质因数的方法分析
本文实例讲述了Python实现将一个正整数分解质因数的方法。分享给大家供大家参考,具体如下:
遇到一个python编程联系题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
版本一:
开始,没动脑子就开始写了,结果如下代码
#!/usr/bin/python
#014.py
importmath
number=int(raw_input("Enteranumber:"))
whilenumber!=1:
foriinrange(1,number+1):
if(number%i)==0andi!=1:
number=number/i
ifnumber==1:
print"%d"%i
else:
print"%d*"%i,
break
结果,输入9876543210这个十位数的时候,报错:
Traceback(mostrecentcalllast):
 File"./014.py",line8,in
   foriinrange(1,number+1):
OverflowError:range()resulthastoomanyitems
版本二:
版本一报错是因为range有了太多的项,于是想着减少range出的list的项。由于,在判断一个数n是否是质数的时候,只需从2到n的平方根就行了,所以有了版本二,代码如下:
#!/usr/bin/python
#014_1.py
importmath
number=int(raw_input("Enteranumber:"))
list=[]
defgetChildren(num):
print'*'*30
isZhishu=True
foriinrange(2,int(math.sqrt(1+num))+1):#多加个1
ifnum%i==0andi!=num:
list.append(i)
isZhishu=False
getChildren(num/i)
break
ifisZhishu:
list.append(num)
getChildren(number)
printlist
这样,数字可以增大很多而不至于报错。但是,也是很有限度的,当输入大数如123124324324134334时,会导致内存不足,杀死进程
Traceback(mostrecentcalllast):
 File"./014_1.py",line20,in
   getChildren(number)
 File"./014_1.py",line11,ingetChildren
   foriinrange(2,int(math.sqrt(1+ num))+1):
MemoryError
为了追求能对更大的数进行操作,猜想原因可能是递归调用时每次都需要建立一个很大的由range()建立的list,于是想避免range的使用,于是有了版本三:
版本三:
代码
#!/usr/bin/python
#014_1.py
importmath
number=int(raw_input("Enteranumber:"))
list=[]
defgetChildren(num):
print'*'*30
isZhishu=True
i=2
square=int(math.sqrt(num))+1
whilei<=square:
ifnum%i==0:
list.append(i)
isZhishu=False
getChildren(num/i)
i+=1
break
i+=1
ifisZhishu:
list.append(num)
getChildren(number)
printlist
同样对123124324324134334进行操作,速度很快,得到如下结果
 Enteranumber:123124324324134334
******************************
******************************
******************************
******************************
******************************
[2,293,313,362107,1853809L]
PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:
在线