当前位置: 代码迷 >> J2SE >> 啊java程序。键盘输入任意30个数,打印出所有两两一组的情况
  详细解决方案

啊java程序。键盘输入任意30个数,打印出所有两两一组的情况

热度:96   发布时间:2016-04-23 20:08:16.0
求助啊。。java程序。。键盘输入任意30个数,打印出所有两两一组的情况
小弟实在写不出来了。。求大神祝我一臂之力
------解决思路----------------------
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
int count = 0;// 用于计数
int size = 30;// 集合的大小
Scanner sca = new Scanner(System.in);
// 循环输入30个数
for (int i = 1; i <= size; i++) {
System.out.println("请输入第" + i + "个数字");
list.add(sca.nextInt());
}
for (int i = 0; i < size; i++) {
// 第i个依次与第i+1,i+2,i+3.......size-1 个数组合
for (int j = i + 1; j < size; j++) {
count++;
System.out.print("(" + list.get(i) + ", " + list.get(j) + ")");
}
System.out.println();
}
System.out.println("组合总数:" + count);
}
}

我用集合写的方法, 参考
------解决思路----------------------
我给你实现的是最难的情况,枚举所有随机5个在加另外两个的情况,总共有C(35,5)*c(30,2),大约是6*10^7。就是退一步认为每个数组只占1B的话,x写入文件中那么就是6*10^7B=60M.所以我试了下需要运行很久。楼主需要的应该是比较简单的随机选5个,而不是枚举吧。附上我的代码,运行的话,需要强制终止,全部运行完时间需要太久,有错误的地方,望高手指出。。
import java.util.*;
import java.io.*;
import static java.lang.System.out;
public class Test{
public static int a[] = new int[36];//存放输入数据
public static long count = 0;//用于计数,帮助分析程序是否正确
public static int result[] = new int[7];//存放所选的5个数,与2个随机组合的数,下标从0开始 
public static void store(int[] result) throws Exception{
FileWriter fw = new FileWriter(new File("Test.txt"),true);
for(int i=0;i<result.length;i++){
fw.write(result[i]+" ");
}
fw.write("\n");
fw.close();
}
public static void combine(boolean[] b)throws Exception{
for(int i=1;i<=35;i++){//遍历
if(b[i]) continue;//在5个之中用过了,直接跳过
for(int j=i+1;j<=30;j++){//第i个依次与第j个组合
if(b[j]) continue;//同上
result[5] = a[i]; //把这两个加入到选好的5个里面
result[6] = a[j];
Arrays.sort(result);
//情况比较多,存储到文件中
count++;
store(result);
}
out.println();
}
}
public static void main(String[] args) throws Exception{
int i=0,j=0,k=0,l=0,m=0;
boolean[] b = new boolean[36]; //默认是false,不用初始化了
Scanner cin = new Scanner(System.in);
out.println("请输入35个数字");
for(i=1;i<=35;i++)
a[i] = cin.nextInt();//如果不是整数,换一下函数
int inc = 0;
for(i=1;i<=31;i++){
b[i] = true;
result[inc++]=a[i];
for(j=i+1;j<=32;j++){
b[j] = true;
result[inc++]=a[j];
for(k=j+1;k<=33;k++){
b[k] = true;
result[inc++]=a[k];
for(l=k+1;l<=34;l++){
b[l] = true;
result[inc++]=a[l];
for(m=l+1;m<=35;m++){
b[m] = true;
result[inc++]=a[m];
combine(b);
//退回的过程要消除之前的选择
inc--;
b[m] = false;
}
inc--;
b[l] = false;
}
inc--;
b[k] = false;
}
inc--;
b[j] = false;
}
inc--;
b[i] = false;
}
out.println("总计:"+count);
}
}
  相关解决方案