本文實例講述了Python實現將一個正整數分解質因數的方法。分享給大家供大家參考,具體如下:
遇到一個python編程聯系題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
版本一:
開始,沒動腦子就開始寫了,結果如下代碼
#! /usr/bin/python# 014.pyimport mathnumber = int(raw_input("Enter a number: "))while number != 1:  for i in range(1, number + 1):    if (number % i) == 0 and i != 1:      number = number / i      if number == 1:        print " %d" %i      else:        print " %d*" %i,      break結果,輸入9876543210這個十位數的時候,報錯:
Traceback (most recent call last):
  File "./014.py", line 8, in <module>
    for i in range(1, number + 1):
OverflowError: range() result has too many items
版本二:
版本一報錯是因為range有了太多的項,于是想著減少range出的list的項。由于,在判斷一個數n是否是質數的時候,只需從2到n的平方根就行了,所以有了版本二,代碼如下:
#! /usr/bin/python# 014_1.pyimport mathnumber = int(raw_input("Enter a number: "))list = []def getChildren(num):  print '*'*30  isZhishu = True  for i in range(2, int(math.sqrt(1 + num)) + 1): #多加個1    if num % i == 0 and i != num :      list.append(i)      isZhishu = False      getChildren(num / i)      break  if isZhishu:    list.append(num)getChildren(number)print list這樣,數字可以增大很多而不至于報錯。但是 ,也是很有限度的,當輸入大數如 123124324324134334 時,會導致內存不足,殺死進程
Traceback (most recent call last):
  File "./014_1.py", line 20, in <module                                            >
    getChildren(number)
  File "./014_1.py", line 11, in getChildren
    for i in range(2, int(math.sqrt(1 +  num)) + 1):
MemoryError
為了追求能對更大的數進行操作,猜想原因可能是遞歸調用時每次都需要建立一個很大的由range()建立的list,于是想避免range的使用,于是有了版本三:
版本三:
代碼
#! /usr/bin/python# 014_1.pyimport mathnumber = int(raw_input("Enter a number: "))list = []def getChildren(num):  print '*'*30  isZhishu = True  i = 2  square = int(math.sqrt(num)) + 1  while i <= square:    if num % i == 0:      list.append(i)      isZhishu = False      getChildren(num / i)      i += 1      break    i += 1  if isZhishu:    list.append(num)getChildren(number)print list同樣對123124324324134334 進行操作,速度很快,得到如下結果
新聞熱點
疑難解答