素因子分解的python实现
问题:给定一个正整数,求解其素因子分解式。
素因子分解适合于以递归的方式处理:给定一个数N,首先找到将它分解为两个较小的数的乘积(姑且称之为二因子分解):N=N1*N2。然后进一步对N1和N2分别对其进行二因子分解,直到最后得到所有素因子为止。
在递归调用的过程中,要解决如何将得到的素因子保留下来。这里事实上涉及到两个问题:(1)如何将子函数调用内部的运算结果带回调用处;(2)用什么数据结构来存储结果。
Python的list对象类型非常适合于本问题的解决,一方面,list可以方便地在其尾部追加元素(list.append),而不需要事先确定其存储长度;另一方面,list是属于所谓的mutable object,在子函数中对从函数接口处传入的list object的元素内容的改变自然地被带回到上层。这类似于C/C++中函数接口中的指针参数所实现的pass-by-reference,虽然指针本身不允许子函数修改(修改了也不会被带回调用处),但是指针所指向的存储区的内容是可以改变的。
# This function performs factorization over N in recursive way. # The result factors are stored in 'q_factor'. # If N is a prime number, then return True; otherwise return False. def factor(N, q_factor=None): if q_factor is None: q_factor = []; isPrime = True; # Initialize isPrime to False. for x in range(2, N): if N % x == 0: factor1 = x; factor2 = N//x; #Note: If '/' is used, factor2 will be taken as float and causes error. print(N, 'equals', factor1, '*', factor2); print('Further factorization over',factor1); factor(factor1, q_factor); print('Further factorization over',factor2); factor(factor2, q_factor); isPrime = False break # loop fail through without finding a factor, # which means that N is a prime number. if isPrime is True: print(N, 'is a prime number'); q_factor.append(N); return isPrime;
#! /usr/bin/env python3.3 from mylib import factor # 'factor()' is defined in 'mylib' module. # int() is used for string to int conversion. N = int(input("Please input a positive integer for factorization(>=2):")) if N<2: print("N shall be not less than 2"); exit q_factor=[] isPrime = factor(N,q_factor) if isPrime is False: print(N, " is factorized into:", q_factor) else: print(N, " is a prime number by itself!")
以下是运行结果例:
>>> ================================ RESTART ================================
>>>
Please input a positive integer for factorization(>=2):98767654
98767654 equals 2 * 49383827
Further factorization over 2
2 is a prime number
Further factorization over 49383827
49383827 equals 17 * 2904931
Further factorization over 17
17 is a prime number
Further factorization over 2904931
2904931 equals 269 * 10799
Further factorization over 269
269 is a prime number
Further factorization over 10799
10799 is a prime number
98767654 is factorized into: [2, 17, 269, 10799]
>>>
浙公网安备 33010602011771号