python入门级别算法系列 -1 分解质因数
2019-05-16 本文已影响0人
不分享的知识毫无意义
1.题目:分解质因数
将一个正整数分解质因数,即分解为由若干个质数相乘的结果,例如:输入90,打印出, 其中2、3、5都是质数。该题目思路比较简单,只需要用while for循环即可解决,适合新手入门python进行练习,本文将由易到难介绍几种实现思路,并附上代码和所需要的知识点。
2.思路1:首先设置函数判断是否是质数,然后依次进行分解
直接上代码
#判断数据是否是质数,用于保证大整数分解时每一个因子都是质数
def zhishu(num):
for i in range(2,num):
if num % i == 0:
#print('%d 是个合数,可以分解' %num)
return True
#break 楼主之前一个版本加了break,忽略了函数return之后其他语句不会执行,相当于break了。
else:#和for对齐,是python独有的语法如果for循环里的语句执行结束后执行else语句,如果for循环里有break则else后的语句不会执行。
#print('%d 是个质数,请输入1个合数' %num)
return False
def zhiyinshufenjie(num):
nump = num#用于输出 90 = 2*3*3*5
tmp = []
if not zhishu(num):
print('%num是个质数,请输入一个合数')#如果是质数则不用执行语句
else:
while num:#用于控制循环次数直到为0
if not zhishu(num) and num != 1:#排除1,因为1在分解中没有意义
tmp.append(num)
num = 0
else:
for i in range(2, int(num**(1/2))+1):#num**(1/2)为了缩短计算范围,在计算超大数时有用
if num % i == 0 & (not zhishu(i)):
tmp.append(i)
num = int(num/i)
#print(i)
break
#print(num)
tmp = sorted(tmp)#排成有序数组
#设置打印格式
str1 = ''
for i in range(len(tmp)):
if i== 0:
str1= str1 + str(tmp[i])
else:
str1= str1 + '*' +str(tmp[i])
returnstr = '%d = %s' % (nump,str1)
return returnstr
a=zhiyinshufenjie(888888)
print(a)
这种思路比较简单,基本没过大脑,遇到问题采用暴力求解的方式解决,存在很多可以优化的地方。
3.思路2:优化求解法,是在第一种思路下进行优化
第二种思路区别于第一种思路在于,第一个被整除的数永远是质数,比如1,2,3,5,7,如果是4和6那么也能被2整除。此时只需要不断更新被除后的数,就能计算出最终的质因数。此处还有几个小技巧,如保持除完以后还是整数,用//,在同一行打印,则设置print的参数为end=''。
def fenjiezhiyinshu(num):
n = num
f = []
for j in range(1,num//2+1):
for i in range(2, n):
if n % i == 0:
f.append(i)
n = n//i
break
if len(f) == 0:
print("这是一个质数,请重新带入合数")
else:
f.append(n)
f.sort()
print('%d=%d'% (num,f[0]), end='')
for i in range(1,len(f)):
print('*%d'%f[i] ,end='')
4.思路3:递归求解法
质因数分解时非常适合做递归算法练习的一个问题,程序的最终出口为不断输出可以被输入值整除的质数,直到最后一个数。
import numpy as np
def zhiyinshufenjie(num, tmp):
for i in range(2,int(num**(1/2))+1):
if num % i == 0:
tmp.append(i)
num = num//i
return zhiyinshufenjie(num,tmp)
if len(tmp) == 0:
print('%d是个质数'%nn)
else:
tmp.append(num)
str1 = ''
for i in range(len(tmp)):
if i== 0:
str1= str1 + str(tmp[i])
else:
str1= str1 + '*' +str(tmp[i])
returnstr = '%d=%s' % (np.cumprod(tmp)[-1],str1)
return returnstr
由于是递归没法保存第一个输入的num值,因此用了numpy的cumprod函数对列表进行累乘,得到最初的值。当然这个递归还可以写的更简单,定义的质因数分解函数第二个参数可以设置为str,这样的话第一个输入的num值就可以以str形式保存下来,再不断迭代得到的输出格式,这部分留给读者自己去考虑完成。