利用标志位 解题(转)

用JAVA编写一个程序,从下面的数字里找出几个数字得到组合,要求组合里的数字相加结果为18317;不限定相加的数字的个数

,一个数字可以不用,最多可以用一次;
  27个数字为{7263 7623 8997 5963 6015 4280 6420 7690 6820 4600 3203 7623 6320 6725 5333 6161 3028 3180 3056 4367 

3208 3238 3363 5195 1091 5897 3972} 

//整体算法思路是这样的 假设有六位数字。1234,2345,3456,5678,7890,9012 每位数字都有两种可能性。用到 1,未用到 0 

  这样六位数字都用到就是111111 都未用//到就是000000 有一位用到就是100000 010000 001000 000100 000010 000001  

同理 用到二位就是 110000 101000 100100 ........
//三位就是111000 110100 110010 ..........
//把所有可能性列出来后你就会发现正好是从0 到2的6次方 的二进制数字。把所有为1的对应的数字相加就会得到所有可能性。





public class Test
  {
  int[] a=
  {7263,7623,8997,5963,6015,4280,6420,7690,6820,4600,
  3203,7623,6320,6725,5333,6161,3028,3180,3056,4367,
  3208,3238,3363,5195,1091,5897,3972};
  int number=134217728; //2的27次方
  int sum=0;
  int temp=0;
  public void findNumber(int num)
  {
  for(int i=0;i<number;i++)
  {
  String s=Integer.toBinaryString(i);//把i转换成二进制字符串s
  char[] b=new char[s.length()];
  b=s.toCharArray();//字符串s转换成字符数组b
//把字符数组b补齐27位,
  char[] c=new char[27];//定义一个字符数组c
  int index=c.length-1;
  for(int m=0;m<c.length;m++)
  {
  c[m]='0';//初始化字符数组c为0
  }
  for(int j=b.length-1;j>=0;j--)
  {
  c[index--]=b[j];//把数组b复制到数组c.
  }
  for(int n=0;n<c.length;n++)
  {
  if(c[n]=='1')//如果为1
  {
  sum+=a[n];//相加
  }
  }
  if(sum==num)//如果和为要查找数字则打印
  {temp++;
  for(int k=0;k<c.length;k++)
  {
  if(c[k]=='1')
  System.out.print("a["+k+"]"+" "+a[k]+" ");
  }
  System.out.println();
  }
  sum=0;
  }
  
  System.out.println("一共有"+temp+"种可能性");
  
  
  }
  
  
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值