题目:把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来,
例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1)
由例子可见,该程序是去重的,应为1+1+2也可以写成1+2+1 ,所以,写方法必须要去重
package org.jeecg.modules.applet.controller;
import java.util.*;
/**
* 把一个数分解成任意几个数之和,把一个数的所有和式分解的结果全部输出出来
* 例如:4的结果有,(1+3),(2+2),(1+1+2),(1+1+1+1)
*/
public class Composition extends ArrayList<Integer> {
/**
* 重写equals方法方便去重,排除掉重复的数据
* @param other
* @return
*/
@Override
public boolean equals(Object other){
Composition comp = (Composition)other;
Collections.sort(this);
Collections.sort(comp);
if(this.isEmpty() || comp.isEmpty() || this.size() != comp.size())
return false;
for(int i=0; i<this.size(); i++)
if(this.get(i) != comp.get(i))
return false;
return true;
}
@Override
public int hashCode() {
return 0;
}
}
class main {
public static void main(String[] args) {
int n=1;
Scanner sc=new Scanner(System.in); //在控制台手动输入值 按enter键 便可得到结果
n=sc.nextInt();
System.out.println(toStr(calc(n)));
}
public static Set<Composition> calc(int n) {
Set<Composition> devideSet = new HashSet<Composition>();
Composition Composition = new Composition();
switch (n) {//如果是1直接返回1
case 1:
Composition.add(1);
devideSet.add(Composition);
return devideSet;
case 2://如果是2返回1+1
Composition.add(1);
Composition.add(1);
devideSet.add(Composition);
return devideSet;
default:
for (int i = 1; i <= n / 2; i++) {
Composition = new Composition();
Composition.add(i);
Composition.add(n - i);
devideSet.add(Composition);
if (i <= n - i) {
Set<Composition> partial_pos = calc(n - i);//递归调用
for (Composition pos : partial_pos) { //当n==2时会走这个方法
pos.add(i);
devideSet.add(pos);
}
}
}
return devideSet;
}
}
public static String toStr(Set<Composition> devideSet) {
String str = "";
for (Composition de : devideSet)
str += toStr(de);
return str;
}
public static String toStr(Composition Composition) {//将数字拼接成表达式
String str = Composition.get(0) + "";
for (int i = 1; i < Composition.size(); i++)
str += (" + " + Composition.get(i));
str += "\n";
return str;
}
}