从一副扑克牌中抽出15张,用java输出这15张牌的所有的可能的组合

写出算法,能够输出所以的可能的组合。
我想一下,确实是太多了,那就20张抽5张吧,我只是想看下算法。想看看用迭代是怎么实现的。水影129的算法错了,中间会有重复的,不过还是很感谢她。
最新回答
真心可是半斤ぴ

2024-09-17 01:19:06

是组合数学中的"组合", 所以应该没有顺序问题, 水影129的是"排列", 情况数应该是15!(15的阶乘)倍.

我是用迭代做的, 只是打印出来, 之前做了一个返回所有情况的二维数组, 结果内存溢出了, 情况太多, 就不要说数据了, 你看看打印的代码吧, 不过会打很长时间, 因为情况太多了, 应该是54! / 15!/ 39! = 8,654,327,655,120 种情况, 下面的代码我用20以内长度的都试过, 没有错误(我可怜的机器实在跑不动54选15):

import java.util.ArrayList;

public class PuKu {
public static int count = 0;
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
for (int i = 0; i < 54; i++) {
arr.add(i + "");
}
compute(arr, 15);
System.out.println(count);
}
public static void compute(ArrayList<String> arr, int num) {
compute(arr, new ArrayList<String>(), num, 0);
}
private static void compute(ArrayList<String> arr, ArrayList<String> result, int num, int start) {
if (result.size() == num) {
count ++;
System.out.println(result);
} else {
int size = arr.size();
if (size < num) {
return;
}
for (int i = start; i < size; i++) {
ArrayList<String> tempResult = new ArrayList<String>(result);
tempResult.add(arr.get(i));
compute(arr, tempResult, num, i + 1);
}
}
}
}

思想是迭代, 每次在result中增加一个, 每个级别的起始位置start都向后一位, 使得之前选过的不再选, 每得到一组结果就打印一次, 最后统计数量.

我这里是用ArrayList实现的, 为的是使代码更简明, 如果需要对数组进行组合, 请写在问题补充中.
逗二比

2024-09-17 00:18:55

public class aa {
public static void main(String args[]){
String puke[]={"黑桃A","黑桃2","黑桃3","黑桃4","黑桃5","黑桃6","黑桃7","黑桃8","黑桃9","黑桃10","黑桃J","黑桃Q","黑桃K","红桃A","红桃2","红桃3","红桃4","红桃5","红桃6","红桃7","红桃8","红桃9","红桃10","红桃J","红桃Q","红桃K","梅花A","梅花2","梅花3","梅花4","梅花5","梅花6","梅花7","梅花8","梅花9","梅花10","梅花J","梅花Q","梅花K","方块A","方块2","方块3","方块4","方块5","方块6","方块7","方块8","方块9","方块10","方块J","方块Q","方块K","红司令","白司令"};
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;
for(a=1;a<=40;a++){
for(b=a+1;b<=41;b++){
for(c=b+1;c<=42;c++){
for(d=c+1;d<=43;d++){
for(e=d+1;e<=44;e++){
for(f=e+1;f<=45;f++){
for(g=f+1;g<=46;g++){
for(h=g+1;h<=47;h++){
for(i=h+1;i<=48;i++){
for(j=i+1;j<=49;j++){
for(k=j+1;k<=50;k++){
for(l=k+1;l<=51;l++){
for(m=l+1;m<=52;m++){
for(n=m+1;n<=53;n++){
for(o=n+1;o<=54;o++){
System.out.println(puke[a-1]+","+puke[b-1]+","+puke[c-1]+","+puke[d-1]+","+puke[e-1]+","+puke[f-1]+","+puke[g-1]+","+puke[h-1]+","+puke[i-1]+","+puke[j-1]+","+puke[k-1]+","+puke[l-1]+","+puke[m-1]+","+puke[n-1]+","+puke[o-1]);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
我帮你做好了,你自己在eclipse里面整理一下格式就可以了。我运行过了,可以的,不过效率不高,哈哈。
我想静静

2024-09-17 08:10:37

抢个好位置
北橙旧梦

2024-09-17 10:09:04

这个组合也太多了吧
深蓝菇凉

2024-09-17 04:22:46

54*53*52*51*50*....*49