python入门级别算法系列 -1 分解质因数

2019-05-16  本文已影响0人  不分享的知识毫无意义

1.题目:分解质因数

  将一个正整数分解质因数,即分解为由若干个质数相乘的结果,例如:输入90,打印出90=2*3*3*5, 其中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形式保存下来,再不断迭代得到90=2*3*3*5的输出格式,这部分留给读者自己去考虑完成。

上一篇下一篇

猜你喜欢

热点阅读