python “随机整数分解质因子”写法
普通思路都是先求出1到该正整数区间内的质数,然后通过遍历循环的方式依次求解。但本文提供另一种思路,充分利用了质数的特性,代码复杂度低,时间复杂度低。代码如下:
aa = input("输入一个整数")
aa = int(aa)
b = 2 # 起始质数为最小质数
xx = []
while True:
if aa % b != 0:
b += 1
else:
aa = aa // b
xx.append(b)
if aa == 1:
break
print(xx)
输入一个整数450
[2, 3, 3, 5, 5] #输出
引用一下这位博主发布的“分解质因子”的文章,各位可以进行下对比–>这是个超链接
解释
这里利用了质数的特性,我总结的结果是:一个大于1的正整数,一定会比小于或等于该数的质数分解;且当该数被最小质数分解后,继续分解剩余的数,则剩余的数一定不会被分解过的质数再次分解;且被最小质数分解后的数,在遇到“下一个被分解的质数”之前,一定不会被非质数的正整除分解。
这里的“下一个被分解的质数”是指比上一个被分解的质数大且比下一个被分解的质数小的质数,如果是最后被分解的质数,则比上一个被分解的质数大即可;一定不会被非质数的正整数分解是指:一定不会被被分解的两个质数之间的任何非质数的正整数分解,举个例子:
假设需要分解的数是26,分解质因数的结果是(2, 13), 那么他一定不会被2-13之间的非质数的正整数分解
进阶版
def prime_factors(n):
factors = []
# 首先处理2的因数
while n % 2 == 0:
factors.append(2)
n = n // 2
# 处理奇数因数,从3开始,每次增加2
i = 3
while i * i <= n:
while n % i == 0:
factors.append(i)
n = n // i
i += 2
# 如果n仍然大于2,那么它本身是一个质数
if n > 2:
factors.append(n)
return factors
# 示例用法
n = 56
print(f"{n}的质因数是: {prime_factors(n)}")
解释:
处理2的因数:首先,我们处理所有的2的因数,因为2是唯一的偶数质数。
处理奇数因数:然后,我们从3开始,每次增加2(跳过偶数),检查是否是n的因数。
最后的质数:如果最后n仍然大于2,那么它本身是一个质数,直接加入到因数列表中。
时间复杂度:
这个算法的时间复杂度是O(sqrt(n)),因为我们在最坏情况下只需要检查到sqrt(n)的所有可能的质因数。