整数的分划问题

如,对于正整数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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值