美文网首页
练习-分解质因数

练习-分解质因数

作者: 酸甜柠檬26 | 来源:发表于2019-12-07 22:41 被阅读0次

    Question:
    将一个正整数分解质因数。例如:输入90,打印出90=233*5
    方法一:
    分两步执行
    因为只有合数可以分解质因数,所以先定义一个函数,判断num是否是合数,从而返回一个布尔型,在后面做条件判断时可以调用该函数;

    第二步,如果num是质数,则打印重新输入数字;
    如果num是合数,则开始进入主题,开始取出所有满足质因数的因子,基本思路是:
    质因数和相对应的商同时判断是否都是质因数,如果num%i=0并且i是质数,则取出该i,然后break,然后判断对应的商是否是质数,如果不是质数,则又回到上面的一步,开始取该商相应的质因数,如果num%i=0并且i是质数,取出该I,然后再次判断对应的商是否是质数,如此往复,知道对应的商是质数为止,令num=0跳出循环。
    最后在连接90=233*5的时候,用到join来连接。

    #判断num是合数还是素数
    def heshu(num):
        for i in range(2,num):
            if num % i == 0:
                return True#合数
                break
        else:
            return False#质数
    
    # 当num是合数的基础上来找出所有的可重复的因子
    List = []
    def fenjie(num):
        nump = num
        if not heshu(num):
            print('请输入一个合数')
        else:
            while num:
                if not heshu(num):
                    List.append(num)
                    num = 0
                else:
                    for i in range(2,int(num/2+1)):
                        if num % i == 0 and not heshu(i):
                            List.append(i)
                            break
                num = int(num / i)#找出一个质因数以后的相应的另一个商
            List.sort()
        print(str(nump),'=','*'.join(str(i) for i in List))
    fenjie(888)
    

    方法二:
    一步到位
    先把数字90print出来写在右边,以end=‘’结尾,后面再接相应的左边的乘号。
    因为判断能否被2-num的数整除时,取不到1,所以把1单独拎出来做一个条件,
    然后再创建一个while循环:
    通过if n%i ==0来找出第一个出现的因数i,巧妙的地方在于紧接着用n // i来找相对应的商,如果商=1,则说明此是最后一个要找的质因数i,后面不再有商了,如果不等于1,说明商是合数,则取出相应的i排列在后面,然后该循环体break,再进入下一个循环,再重复计算上面得到的不等于1的商的第一个出现的质因数i,然后再和前面一样,
    再取出该新i对应的新商,如果新商=1,则打出最后一个质因数,否则打印出对应的i然后break然后进入下一个循环体,知道找到最后一个质因数满足其只有自身作为因数的那个质因数。

    def reduceNum(n):
        print('{} = '.format(n),end='')
        if not isinstance(n, int) or n <= 0 :
            print('请输入一个正确的数字 !')
            exit(0)
        elif n in [1] :
            print('{}'.format(n))
        while n not in [1] :# 循环保证递归  
            for i in range(2, n + 1) :
                if n % i == 0:
                    n //= i
                    if n == 1:
                        print(i)
                    else : # i 一定是素数
                        print('{} * '.format(i),end='')
                        break
    reduceNum(888)
    

    相关文章

      网友评论

          本文标题:练习-分解质因数

          本文链接:https://www.haomeiwen.com/subject/lldpgctx.html