将正整数n划分成k个不同正整数的乘积,输出所有划分方法

//将正整数n划分成k个不同的正整数(不大于max)的乘积,输出所有划分方法,如果不能则输出“无法划分”
public class MultiDivision {
	public static boolean multiDivide(int n, int k, int max, int[] buf){
		if(max == 0) 
			return false;
		if(k==1)
			if(n<=max){
				buf[buf.length-k] = n;
				for(int i:buf)
					System.out.print(i+" ");
				System.out.println();
				return true;
			}else{ //不能划分为k个
				return false;
			}
		boolean flag = false;
		for(int factor=max; factor>0; factor--){
			if(n%factor == 0){//递归测试该因子是否是结果的一部分
				buf[buf.length-k] = factor;
				boolean f = multiDivide(n/factor, k-1, factor-1, buf);
				flag = flag || f;
			}
		}
		return flag;
	}
	
	public static void main(String[] args){
		int k=5, n=2015;
		int[] buf = new int[k];
		if(!multiDivide(n, k, 10, buf)){
			System.out.println("无法划分");
		}
		n = 2016;
		if(!multiDivide(n, k, 10, buf)){
			System.out.println("无法划分");
		}
	}
}
无法划分
9 8 7 4 1 
8 7 6 3 2 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值