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