java算法问题

herosongkai 2012-09-04 02:33:03
有数组int[] masks = {1,2,4,8,16,32,64,128},现在我有一个常量m,
m是由masks里面的若干数字相加得来的,比如m=7,得到m=1+2+4,
129 = 128+1等等
写一个方法如何得到m由哪几个数字组成。
...全文
174 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alexander 2012-09-04
  • 打赏
  • 举报
回复
1,2,4,……

这个数组不是二进制的基数表么。只要把输入按二进制解析就好了嘛。

以下代码仅供参考:

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int sum = -1;

do {
System.out.print("Input a number:");

String str = input.next();

try {
sum = Integer.parseInt(str);
if (sum <= 0)
System.out.println("The number must larger than zero!");
} catch (Exception e) {
System.out.println("Format error!");
sum = -1;
}
} while (sum <= 0);

System.out.print(sum + "=");

for (int i = 1; sum > 0; i <<= 1, sum >>= 1)
if ((sum & 1) > 0) {
System.out.print(i);
if (sum > 1)
System.out.print("+");
}
}
wenhaoxp1987 2012-09-04
  • 打赏
  • 举报
回复
给你弄了做了一个,可以精简修改一下,希望对你有帮助。



public class TesNumber {
public static int[] ss = {1,2,4,8,10,16,20,32,64,128};
public static int point=-1;
public static void main(String args[]){
for(int i=0;i<ss.length-1;i++){
if(24>=ss[i]){
point=i;
}
}
for(int j=2;j<point+1;j++){
List<String> list=getValue(24,j);
for(String strData:list){
System.out.println(strData);
}
}
}

public static List<String> getValue(int data,int index){
//得到小于给出数的数组最大索引,减少数组的大小
List<String> list=new ArrayList();
Map<String,Integer> map=progressData(index);
for(String str:map.keySet()){
if(map.get(str)==data){
list.add(str);
}
}
return list;
}

//得到精简的小于给出的数的数组
public static int[] getNewObject(){
int[] ss2 = new int[point+1];
for(int i=0;i<=point;i++){
ss2[i]=ss[i];
}
Arrays.sort(ss2);
return ss2;
}

//递归得到无重复的排列组合
public static Map progressData(int num){
Map<String,Integer> map=new LinkedHashMap<String,Integer>();
int[] ss2 = getNewObject();
if(num==2){
for(int k=0;k<=point-1;k++){
for(int n=k+1;n<=point;n++){
map.put(""+ss2[k]+"+"+ss2[n], ss2[k]+ss2[n]);
}
}

}
else{
Map<String,Integer> map2=progressData(num-1);
for(String strt:map2.keySet()){
for(int x=0;x<ss2.length;x++){
if(!strt.contains(String.valueOf(ss2[x]))){
String clearString=strt.trim();
String[] stringClear=clearString.split("\\+");
//从小到大,无重复
boolean flag=false;
for(String sss:stringClear){
if(ss2[x]<Integer.parseInt(sss)){
flag=true;
}
}
if(!flag){
int value=map2.get(strt);
map.put(""+strt+"+"+ss2[x], value+ss2[x]);
}
}
}
}
}
return map;
}
soton_dolphin 2012-09-04
  • 打赏
  • 举报
回复
最好先sort一下数组
soton_dolphin 2012-09-04
  • 打赏
  • 举报
回复
用这个数字减去数组中刚刚比它小的那个,然后把那个数字存起来,再用减法得出的数字去减数组中刚刚比它小的数字,然后再存起来,以此类推
herosongkai 2012-09-04
  • 打赏
  • 举报
回复
期待。。。。
eyuntao 2012-09-04
  • 打赏
  • 举报
回复
LZ你的数组内容是固定的嘛? 如果是确定的1,2,4,8... 那就把常量m转化成2进制好了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧