java实现:从8个数中任取5个数,排列组合出所有不重复的组合,打印出来

如:
12345678
打印结果:
12345
13456
23456
34567
.....
要求不重复:12345跟54321为重复。
12345 后面13456我只是这样举例。
5个数一样的就为重复数据,不管5个数的位置。

我简单的写了一下,for循环部分应该是用方法封装的,但是有些繁琐,就没去写了,而且你的问题本身也有问题: 如果 12345跟54321为重复 ,那么
12345跟54312 算不算是重复呢? 如果12345跟54321为重复,那么也只有这2个数重复,其它所有的都不重复,你想想对不?

public static void main(String[] args) {
int [] ran = new int[8];
for (int i = 0; i < ran.length; i++) {
ran[i]=i+1;
}
Random random = new Random();
int loop = 5;
int[] save = new int[5];
int rc = 0;
while (loop > 0) {
//随即抽取数组下标
int index = random.nextInt(ran.length);
int r = ran[index];
save[rc++] = r;
ran = remove(ran, r);
loop--;
}

//随即选的5个数
for (int i = 0; i < save.length; i++) {
System.out.print(save[i]+",");
}
System.out.println("");
int count = 5*4*3*2;
String [] num = new String[count];

label:
for (int i = 0; i < save.length; i++) {
int [] a =remove(save, save[i]);
for (int j = 0; j < a.length; j++) {
int [] b =remove(a, a[j]);
for (int k = 0; k < b.length; k++) {
int [] c =remove(b, b[k]);
for (int m = 0; m < c.length; m++) {
int [] d =remove(c, c[m]);
for (int n = 0; n < d.length; n++) {
num[--count] = save[i]+""+a[j]+
""+b[k]+""+c[m]+""+d[n];
if (count==0) {
break;
}
}
}
}
}
}

for (int i = 0; i < num.length; i++) {
if (!num[i].equals("")) {
System.out.println(num[i]);
}

}

}

//去除已经产生的数,赋给新数组
static int[] remove (int[] n,int r){
int []m = new int[n.length-1];
for (int i = 0, k = 0; i < n.length; i++, k++) {
if (n[i] != r) {
m[k] = n[i];
} else {
k--;
}
}
return m;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-13
昨天的回答有问题,看看这个修改的吧,应该没问题啦:
public class Test {

public static void main(String[] args) {
int data[] = {1,2,3,4,5,6,7,8};
f_1(data);
}
private static void f_1(int data[]) {
for(int i=0;i<=3;i++) {
for(int j=i+1;j<=4;j++) {
for(int k=j+1;k<=5;k++) {
for(int x=k+1;x<=6;x++) {
for(int y=x+1;y<=7;y++) {
System.out.println(data[i]+" "+data[j]+" "+data[k]+" "+data[x]+" "+data[y]);
}
}
}
}
}
}
}

运行结果:
1 2 3 4 5
1 2 3 4 6
1 2 3 4 7
1 2 3 4 8
1 2 3 5 6
1 2 3 5 7
1 2 3 5 8
1 2 3 6 7
1 2 3 6 8
1 2 3 7 8
1 2 4 5 6
1 2 4 5 7
1 2 4 5 8
1 2 4 6 7
1 2 4 6 8
1 2 4 7 8
1 2 5 6 7
1 2 5 6 8
1 2 5 7 8
1 2 6 7 8
1 3 4 5 6
1 3 4 5 7
1 3 4 5 8
1 3 4 6 7
1 3 4 6 8
1 3 4 7 8
1 3 5 6 7
1 3 5 6 8
1 3 5 7 8
1 3 6 7 8
1 4 5 6 7
1 4 5 6 8
1 4 5 7 8
1 4 6 7 8
1 5 6 7 8
2 3 4 5 6
2 3 4 5 7
2 3 4 5 8
2 3 4 6 7
2 3 4 6 8
2 3 4 7 8
2 3 5 6 7
2 3 5 6 8
2 3 5 7 8
2 3 6 7 8
2 4 5 6 7
2 4 5 6 8
2 4 5 7 8
2 4 6 7 8
2 5 6 7 8
3 4 5 6 7
3 4 5 6 8
3 4 5 7 8
3 4 6 7 8
3 5 6 7 8
4 5 6 7 8本回答被提问者采纳
第2个回答  2010-07-12
我的思路是先随机在八个数里边去出五个,
再对这五个数,进行全排列,然后把所得的字符创放到set里,或者你自己写的数据结构里边(要能排序的那种),最后打印你的数据结构就行了
我不知道你的难点,是在思路上还是在全排列上?
第3个回答  2010-07-12
打印结果,必须是那样的么?12345后面为什么不是12346?
相似回答