/**
这个程序可以用来打印给定数组给定位数的组合。
但是有一点小缺憾,就是不能打印出数组中一位组合与所有位组合。
这个问题因为时间太紧迫的关系,以后再考虑吧。
如果需要打印一位与所有位的组合,只好再另用一个循环单独显示。
感想:
这个程序源于郭梦涛哥们出的一道题。
当时就有一位哥们用递归算法把那道题解答出来,我很佩服!!!
可是递归,我还是不太熟,只好用老办法解决。
我想如果我能把所有的组合都列出来,那么那道题也就可以解决了。
这个程序没有采用递归。而是使用一个数组来控制循环。
几行代码,却写了好几天,中间几度想要放弃,太费我的精力。
虽然效率也不见得比递归高,而且还存在着瑕疵。
但是,终于鼓捣出来了,很爽!
我小试几下,结果都正确,我想根据我的设计原理,其它数也不会有错的。
*/
class TestSum11
{
public static void main(String[] args)
{
int[]arr = new int[]{2,6,9,4,0,1,8,2,7,2,2,4,2,1,1,1,1};//给定数组
int n = 2;//组合的位数(n!=1 && n!=arr.length)这个条件有点小遗憾
int x[] = new int[n];//临时数组,用来存放并控制循环的指针
//打印数组
for (int i =0; i<arr.length; i++)
{
System.out.print(arr[i]+",");
}
System.out.println();
//初始化数组并打印
for(int i=0; i<x.length-1; i++)
{
x[i+1] = x[i]+1;
System.out.print(arr[x[i]]+"["+x[i]+"] + ");
}
System.out.println(arr[x[x.length-1]]+"["+x[x.length-1]+"]");
System.out.println("============================");
while (x[0]<arr.length-n)//最外层循环,用来使最末位不断自增。
{
for (int i=0; i<x.length; i++)//第二层循环,用来判断是否产生进位
{
if(x[x.length-1-i]==arr.length-i)//判断后位是否产生进位
{
x[x.length-2-i]++;//如果后位有进位,前位自增
if(x[x.length-2-i]<=arr.length-2-i)
{//如果前一位没有进位,给后位赋值
x[x.length-1-i] = x[x.length-2-i]+1;
}
//判断后位与更多前位同时有进位时的操作
else if (x[x.length-2-i]>arr.length-2-i)
{//下面循环用来寻找适合的值,给最后位赋值
for (int m=x.length-2-i; m>=0; m--)
{
if(x[m]<arr.length-x.length+m)
{//根据找到的符合条件的数,给最后一位赋值
x[x.length-1-i] = x[m]+x.length-m-i;
m = -1;//找到恰当的数时,手动结束寻找循环。
}
}
}
}
}
//打印当前等式。
for(int i=0; i<x.length-1; i++)
{
System.out.print(arr[x[i]]+"["+x[i]+"] + ");
}
System.out.println(arr[x[x.length-1]]+"["+x[x.length-1]+"]");
x[x.length-1]++;//最后位不断自增
}
}
}
|
|