A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚永生 中级黑马   /  2013-2-2 16:02  /  1375 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
这个程序可以用来打印给定数组给定位数的组合。
但是有一点小缺憾,就是不能打印出数组中一位组合与所有位组合。
这个问题因为时间太紧迫的关系,以后再考虑吧。
如果需要打印一位与所有位的组合,只好再另用一个循环单独显示。
感想:
这个程序源于郭梦涛哥们出的一道题。
当时就有一位哥们用递归算法把那道题解答出来,我很佩服!!!
可是递归,我还是不太熟,只好用老办法解决。
我想如果我能把所有的组合都列出来,那么那道题也就可以解决了。
这个程序没有采用递归。而是使用一个数组来控制循环。
几行代码,却写了好几天,中间几度想要放弃,太费我的精力。
虽然效率也不见得比递归高,而且还存在着瑕疵。
但是,终于鼓捣出来了,很爽!
我小试几下,结果都正确,我想根据我的设计原理,其它数也不会有错的。
*/
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]++;//最后位不断自增
  }
}
}

Rectangl.rar

645 Bytes, 下载次数: 139

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马