基于python的分解质因数的算法实现
今天在准备复试的时候突发奇想,如果老师要求写一个基于分解质因数的算法怎么办,于是我对算法的实现做出了思考,大致分为一下三部分
- 实现质数检测
- 实现迭代器
- 实现错误过滤
首先我们要知道一个定律,任何数字的质因数是一定的,不存在第二个。由此我利用for循环制作了一个从小到大依次遍历的暴力分解算法。理论时间复杂度是O(n^2)。
以下是完整的算法,先贴出来(嘻嘻):
def check_pr(num):
for i in range(2, num):
if num % i == 0:
return False
def decompose_prime(num): # 递归分解质数
for i in range(2, num):
if num % i == 0:
print(i, end="*")
if num // i is 2: # 因为range(2,2)是违法的,不被执行,所以需要判断。
print(2, end="*")
elif check_pr(num // i) is not False: # 此处需要判断后面的数字是否为质数,是的话直接输出
print(num // i, end="")
else:
decompose_prime(num // i)
break
# 调用
print("1000"+"=", end="")
decompose_prime(1000)
我大致说一下代码:
第一个check_pr函数是检查num是否为质数的。在decompose_prime函数中的elif有使用到,在这里和num // i is 2一样是起到了过滤器的作用,不过check_pr函数的作用是检查每一次迭代前输入数据是否为质数的,是质数就直接输出,而num // i is 2的设立是因为当输入值为2时,range(2,2)会触犯语法错误,发生违规,python会拒绝执行后面的代码。这就是本算法的两个过滤器了。
而后就是decompose_prime算法的迭代 ( 有和我一样的萌新可能还不清楚递归和迭代的区别,递归可以理解是函数的传入数值不变,一直自我调用,而迭代则是函数传入值变化的调用自己),迭代的传入数据就是将num除去已经得到的质因数的部分传给迭代函数本身。
至此函数书写完成。新手勿喷(嘻嘻)