题解 蓝桥杯 算法提高 ADV-940 因式分解 Java(分治)

题目

将大于1的自然数N进行因式分解,满足:
  N=а1а2а3…аm且1<а1≤а2≤…≤аm<N
  编一程序,输入N(1<N<10^9)

输入要求

N由键盘输入

输出要求

① 第1行至第M行输出所有的M种方案(顺序不限)
② 第M+1行输出方案总数T。

样例输入

N=12

样例输出在这里插入图片描述

分析

这题的数据规模还是比较大的,刚开始我尝试的是使用字符串拼接然后回溯来做,结果超时了,大数据我们要逐一分析.
注意N=а1а2а3…аm且1<а1≤а2≤…≤аm<N这条件,a2是大于等于a1的说明要加判断 避免 6=3x2 这种情况
根据题目给的输出:12=2x6,可以看成12=a1xa2,这个a2很显然可以继续再划分的(12=2x2x3)
那么这题就变成了求出当前数的因式分解,这个乘积为a1xa2 (a1<=a2);

代码

import java.util.Scanner;

public class Main {
	static int T=0;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		StringBuffer sb=new StringBuffer(sc.next());
		//它的输入N是一个字符串,需要转换一下
		int n=Integer.valueOf(sb.substring(2,sb.length()).toString()) ;
		f(n,n+"=",2);
		//注意他的T输出有个空格的
		System.out.println("T"+" "+"="+T);
	}
	static void f(int n,String s,int dex) {
		if(n==1) {
			return;
		}
		String s2=s;
		for(int i=dex;i<=n;i++) {
			if(n%i==0) {
				int m=n/i;
				//a1<=a2<=a3
				if(m<dex) return;
				if(m<i) return;
				//当前s方便给下一组因式分解进行拼接
				s+=i+"*";
				//只输出当前的因式分解
				System.out.println(s+m);
				f(m,s,i);
				T++;
				//回溯
				s=s2;
			}
		}
	}
}

总结

对于初学的我来说做得还是有些吃力的,第一次使用字符串拼接加回溯超时,就想去找老师要答案看看别人怎么写的,还好老师阻止,并给予了我鼓励,最后虽然花了很长时间,但也自己独立思考想了出来,收获还是很大的,码算法题遇到困难还是先自己独立思考来做比较好.收获满满

你可能感兴趣的:(新手初学者,基础,算法,蓝桥杯,java)