python,算法训练 分解质因数

 

详情思路在后面代码中的注释,核心思路是:

1.先用一个数组将不大于b的所有质数保存如[3,10],数组为[2,3,5,7]

2.如果这个[a,b]中值本身就是素数,说明不能被1和本身以外的数约,直接返回本身,即7=7

3.再写一个dfs函数,判断质数数组中的元素是否为[a,b]中值的约数

4.如果是约数,则再考虑经过最小约数后的值,是否还可以再约数,是就再进行约。

dfs(8/2)=dfs(4),即8 = 2*4,4 = 2*2,即8 = 2*2*2

详情在后面代码中的注释,尽量细致的注释上去了。

#输入a,b的值作为范围
a,b = (int(x) for x in input().split())

#用一个zhishu,质数数组保存所有的素数,且这个素数在不大于b的范围内(可以小于a)
z = []
for i in range(2,b+1):#开始遍历值
    flag = 0
    for j in range(1,int(i/2)+1):#看这些值是否为质数,这里有一个技巧因为一个数不会被大于自己一半整除,当然不用这个技巧也不会超时间
        if j != 1 and int(i) % j == 0:#是否为素数,不是素数标记为flag=1
            flag = 1;
            break
    if flag == 0:#如果没有被标记,说明是素数,只能被1和自己整除
        z.append(i)#加入质数数组

#用一个深度查看函数,如有例子8 = 2 * 4,然后将dfs(8/2),即将4又做一次分解,得8=2*2*2
def dfs(k):
    if k <= 1:#如果不能分解了,说明k=1了,即4分解为2*2,dfs(2/2)=dfs(1),1不能分解直接返回
        print()#这里为了格式打印一个换行符
        return;
    #遍历z质数数组
    for x in z:
        #如果k除以质数数组的值没有余数,说明可以除
        if k >= x and k % x == 0:
            print('*',x,sep='',end='')#加入这个x值,即加入例子的2
            dfs(k/x)#然后继续递归dfs(8/2)=dfs(4),再把4进行分解
            break
    return;
#遍历a到b之间的整数
for i in range(a,b+1):
    print(i,'=',sep='',end='')#维持题目格式
    if i in z:#如果i本身就是素数,说明不能被1和本身以外的数约,直接返回本身
        print(i)
    else:#否则开始对这个i进行分解操作,如8
        for x in z:#遍历质数数组------1
            if i >= x and i % x == 0:#看8 % [2,3,5,7]
                print(x,sep='',end='')#找到一个8%2=0,故加入2这个约数
                dfs(i/x)#继续看dfs(8/2)即dfs(4)可以分解不,传入dfs数组--4
                break
        #说明这里为什么没有把1-4这些语句用一个dfs代替,为了统一输出格式否则出现
        #8 = *2*2*2 或者 8 = 2*2*2*,当然笔者有更好的方法,可以在评论讨论一下

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值