问题来源:“蓝桥杯”练习系统算法提高之因式分解 :
将大于1的自然数N进行因式分解,满足:
N=а1*а2*а3…аm且1<а1≤а2≤…≤аm<N
编一程序,输入N(1<N<10^9)
输入要求
N由键盘输入。
输出要求
① 第1行至第M行输出所有的M种方案(顺序不限)
② 第M+1行输出方案总数T。
代码设计思路:声明:小郑只做到统计方案个数 如何输出方案结果还没有解决
如有DL有解决方案,超级感谢!!所以下面给出如何统计方案总数的代码:
如果a=b*c ,且c=d*e or x*y....(b<=c,d<=e,x<=y...)
那么就需要保证b<=d or b<=x,那么a就可以表示为a=b*d*e or a=b*x*y
如果e或y,又可以分解,那么重复以上步骤。
一些细节的地方:当a=b*d*e的时候,为什么是直接考虑e而不是d,也就是说d有没有可能可以由其他因子表示。说实话,这个是我找规律找出来的,你们可以自己动手试一下 比如n=24,模拟一下整个过程会,会发现d是不用考虑的
也就是一个数字的两个因子,前一个小的因子作为判断标准,是不可再分解的,后一个大的因子作为可能分解物,如果可分解,需要保证其因子中的较小者要大于我们刚刚那个判断标准,然后依次深搜下去。如果不可再分解,count不累加。
n=int(input()[2:]) count=0 def dfs(x,a): global count for i in range(2,int(x**0.5)+1): if x%i==0 and i>=a:#是x的因子且大于判断标准 count+=1 dfs(int(x/i),i)#由于for循环i从小到大遍历,那么int(x/i)作为分解对象,i作为判断标准 dfs(n,1) print("T =%d"%count)
我是小郑 正在奔赴热爱奔赴山海! 希望大家都能拿到省一! 拿奖拿到手软!