/** * http://zjfhw.iteye.com/blog/2213877 * 分解和为N的因子 * 思路: * 和为N的因子 必然可以分成N组 * 比如5 * 因子数为5的组:1+1+1+1+1 * 因子数为4的组:1+1+1+1 然后剩余的1 分配给任意一组 2+1+1+1 1+2+1+1 (如果位置不同算为2组的话) * 因子数为3的组:1+1+1 剩余2 ,问题变成 如何将2个1 分配给 3个组 * ...... * * 因子数为1的组:5 */ public class ResolveSum { static int[] arr ; public static void main(String[] args) { //要分解的和为10 int n = 10; //将10转化成 一个长度为n的数组 每个元素都为1 arr =getData(n); //分别去求因子个数为i的因子集 i=1~n for(int i=1;i<=arr.length;i++){ resolveSum(1,0,i,arr.length); clear(arr); } } /** * 分解 * @param index 往第index个位置分发1 * @param payd 计数器,已经分发了payd个1 * @param group 该组有group个元素 * @param N 要分解的和 */ static void resolveSum(int index,int payd,int group,int N){ //循环着进行分发,覆盖 “n个数分发到m个地方” 的所有情况 for(int i=payd;i<N-group;i++){ //首先将第index个位置分发1 arr[index-1]+=1; if(i==N-group-1){ //当剩余值已经分发完,将该组因子打印出来 printElement(arr,group); //将最后操作的位置还原成1 arr[index-1]=1; }else{ //否则开始向index+1的位置进行分发,如果已经超出了该组的因数个数,则不操作 if(index+1<=group) resolveSum(index+1,i+1,group,N); } } } private static void printElement(int[] arr2, int group) { System.out.print(arr2.length+"="); for(int i=0;i<group;i++){ System.out.print(+arr2[i]+ (i==group-1?"":"+")); } System.out.println(""); } public static int[] getData(int n){ int[] data = new int[n]; for(int i=0;i<data.length;i++){ data[i] = 1; } return data; } public static void clear(int[] data){ for(int i=0;i<data.length;i++){ data[i] = 1; } } }
?
?
结果:(没有考虑 加数一样但位置不同的情况,视具体问题进行修改吧...很简单)
?
10=10
10=2+8
10=3+7
10=4+6
10=5+5
10=6+4
10=7+3
10=8+2
10=9+1
10=2+2+6
10=2+3+5
10=2+4+4
10=2+5+3
10=2+6+2
10=2+7+1
10=3+2+5
10=3+3+4
10=3+4+3
10=3+5+2
10=3+6+1
10=4+2+4
10=4+3+3
10=4+4+2
10=4+5+1
10=5+2+3
10=5+3+2
10=5+4+1
10=6+2+2
10=6+3+1
10=7+2+1
10=8+1+1
10=2+2+2+4
10=2+2+3+3
10=2+2+4+2
10=2+2+5+1
10=2+3+2+3
10=2+3+3+2
10=2+3+4+1
10=2+4+2+2
10=2+4+3+1
10=2+5+2+1
10=2+6+1+1
10=3+2+2+3
10=3+2+3+2
10=3+2+4+1
10=3+3+2+2
10=3+3+3+1
10=3+4+2+1
10=3+5+1+1
10=4+2+2+2
10=4+2+3+1
10=4+3+2+1
10=4+4+1+1
10=5+2+2+1
10=5+3+1+1
10=6+2+1+1
10=7+1+1+1
10=2+2+2+2+2
10=2+2+2+3+1
10=2+2+3+2+1
10=2+2+4+1+1
10=2+3+2+2+1
10=2+3+3+1+1
10=2+4+2+1+1
10=2+5+1+1+1
10=3+2+2+2+1
10=3+2+3+1+1
10=3+3+2+1+1
10=3+4+1+1+1
10=4+2+2+1+1
10=4+3+1+1+1
10=5+2+1+1+1
10=6+1+1+1+1
10=2+2+2+2+1+1
10=2+2+3+1+1+1
10=2+3+2+1+1+1
10=2+4+1+1+1+1
10=3+2+2+1+1+1
10=3+3+1+1+1+1
10=4+2+1+1+1+1
10=5+1+1+1+1+1
10=2+2+2+1+1+1+1
10=2+3+1+1+1+1+1
10=3+2+1+1+1+1+1
10=4+1+1+1+1+1+1
10=2+2+1+1+1+1+1+1
10=3+1+1+1+1+1+1+1
10=2+1+1+1+1+1+1+1+1
?
最后再加上
10=1+1+1+1+1+1+1+1+1+1
原文:http://zjfhw.iteye.com/blog/2213877