8-6.素因子分解。以剛才練習中的isprime()和getfactors()函數為基礎編寫一個函數,它接受一個整型作為參數,返回該整型所有素數因子的列表。這個過程叫做求素因子分解,它輸出的所有因子之積應該是原來的數字。注意列表裡可能有重複的元素。例如輸入20,返回的結果應該是[2,2,5]。
【答案】
代碼如下:
def isprime(number): switch = True if number <= 1: switch = False for i in range(2, number / 2 + 1): if number % i == 0: switch = False return switchdef getfactors(number): factorList = [] for i in range(1, number + 1): if number % i == 0 and isprime(i): factorList.append(i) return factorList def findPrimeFactors(number): temp = getfactors(number) k = 1 for i in temp: k = k * i if k == number: return temp else: j = number / k return temp + findPrimeFactors(j) number = int(raw_input("Please input your number ... ")) if isprime(number): print "You have already input a prime number."else: factors = findPrimeFactors(int(number)) factors.sort() print factors
【執行結果】
Please input your number ... 199876[2, 2, 107, 467]Please input your number ... 7099092[2, 2, 3, 3, 7, 11, 13, 197]Please input your number ... 197You have already input a prime number.Please input your number ... 20[2, 2, 5]
【未完】
在函數findPrimeFactors()中使用了遞迴。程式在處理很大的數,比如25200000,消耗的時間會比較長,效率不高。這時可以把函數isprime()和函數getfactors()裡面的range替換成xrange,會有一些改善。
8-7.完全數。完全數被定義為這樣的數字:它的約數(不包括它自己)之和為它本身。例如:6的約數是1,2,3,因為1+2+3=6,所以6被認為是一個完全數。編寫一個名為isperfect()的函數,它接受一個整形作為參數,如果這個數字是完全數,返回1:否者返回0。
【答案】
代碼如下:
def getfactors(number): factorList = [] for i in range(1, number): if number % i == 0: factorList.append(i) return factorListdef isperfect(number): if sum(getfactors(number)) == number: return True else: return False number = raw_input("Please input your number ... ")print number, getfactors(int(number)), isperfect(int(number))
8-8.階乘。一個數的階乘被定義為從1到該數字所有數位乘積。N的階層簡寫為N!。N! = factorial(N) = 1*2*3* ... *(N-2)*(N-1)*N。所以4! = 1*2*3*4。寫一個函數,指定N,返回N!的值。
【答案】
代碼如下:
def factorial(number): k = 1 for i in range(1, number+1): k = k*i return knumber = raw_input("Please input your number ... ")print factorial(int(number))