如,对于正整数n=6,可以分划为:
6
5+1
4+2, 4+1+1
3+3, 3+2+1, 3+1+1+1
2+2+2, 2+2+1+1,2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
public class 整数化分 {
public void numDivide(int num){
if(num < 1)return;
int[] nums = new int[num];
Arrays.fill(nums, 1);
branch(nums,0);
}
private void branch(int[] nums,int move){
//如果数组长度大于1且偏移量(move)没到达数组的末尾, 则说明其存在可合并处理的分支
if(nums.length > 1 && move < nums.length - 1)
merger(nums,nums.length - 1,move);
print(nums);
}
private void merger(int[] nums,int len,int move){
int[] ns = Arrays.copyOf(nums, len);
//如果数组长度大于0则进行处理
if(len > 0){
ns[move] = ns[move] + 1;
//如果偏移量(move)为0, 则说明有可能可以进行数组前两位的合并处理
//如果偏移量(move)不为零,且偏移量(move)没到达数组的末尾 的情况下, 可能可以对此分支数组的前两位进行合并处理
//但为了避免合并数的重复,即move位置的数小于move-1位置的数
if(0 == move || (move > 0 && move < ns.length - 1 && ns[move] < ns[move - 1]))
merger(ns,len - 1,move);
branch(ns,move + 1);
}
}
private void print(int[] nums){
String str="";
for(int i = 0; i < nums.length; i++){
str += nums[i];
if(i != nums.length -1) str += "+";
}
System.out.println(str);
}
public static void main(String[] args) {
new 整数化分().numDivide(6);
}
}