大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > Java键盘获取排列组合数,进行排列显示以及排列计算

Java键盘获取排列组合数,进行排列显示以及排列计算


[摘要]本文主要是对Java键盘获取排列组合数,进行排列显示以及排列计算的讲解,希望对大家学习Java键盘获取排列组合数,进行排列显示以及排列计算有所帮助。

  这段java代码是自己花了很长时间写的,基本java初学者都看的懂,不过理解这个思想就有点复杂了,需要耐心的看下去。如果用传统的for循环来写的话,很复杂,很难实现高中学过的排列组合数的显示,运算结果很简单,但是显示这些有可能的组合就比较困难了。

  import java.util.*;

  public class test15 {

  public static void main(String args[])

  {

  int size;

  int count;

  Scanner s=new Scanner(System.in);

  System.out.print("请输入您输入的组合数的规模:(size)");

  size=s.nextInt();

  int array[] = new int[size];

  for(int i=0;i<size;i++)

  {

  System.out.print("请输入要进行操作的数:\t");

  array[i]=s.nextInt();

  }

  System.out.print("您输入的数为:");

  for(int j=0;j<size;j++)

  {

  System.out.print(array[j]+"、");

  }

  System.out.println("");

  System.out.println("请输入要参与组合数的规模:(count)");

  count=s.nextInt();

  int[] temp=new int[size];

  for(int i=0;i<size;i++)     //临时数组初始化为1、0数组,进行操作

  {

  if(i<count)

  {

  temp[i]=1;

  }

  else

  {

  temp[i]=0;

  }

  }

  System.out.print("初始化的临时数组为:");    //打印临时初始化数组

  for(int i=0;i<size;i++)

  {

  System.out.print(temp[i]);

  }

  System.out.println("");            //换行

  boolean flag=false;

  int key=1;

  do                         //循环进行转置操作     10变01,左边的1全部到最左端操作

  {

  int position=0;        //判断查询到的10 的位置

  int numbers=0;         //记录查到的10位置前面的1的个数

  int q=0;

  int[] result=new int[count];

  System.out.println("");

  for(int i=0;i<array.length;i++)       //输出数组的情况

  {

  if(temp[i]==1)

  {

  result[q]=array[i];

  System.out.print(result[q]+"、");

  q++;

  }

  }

  for (int i = 0; i < size-1; i++)     //找奥最后一个10的位置

  {

  if (temp[i] == 1 && temp[i + 1] == 0)   //判断10的条件

  {

  temp[i] = 0;

  temp[i + 1] = 1;

  position = i;     //第一次循环扫描后,返回第一次循环最后的10的地址

  break;    //跳出if循环

  }

  }

  for (int i = 0; i < position; i++)    //判断10左边的1的个数

  {

  if (temp[i] == 1)

  numbers++;

  }

  for (int i = 0; i < position; i++)     //把10位置左边的1全部移到最左端

  {

  if (i < numbers)

  temp[i] = 1;

  else

  temp[i] = 0;

  }

  System.out.println("");

  System.out.print("参考的临时数组为:");

  for(int i=0;i<size;i++)

  {

  System.out.print(temp[i]);

  }

 

  flag=false;

  for (int i = size-count; i < size; i++)  // 判断是否为最后一个组合:当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。

  {

  if (temp[i] == 0)

  flag = true;  //如果从第size-numbers开始,扫描是不是最后一个组合

  }

  key++;

  }while(flag);

  int p=0;

  int[] array2=new int[count];

  System.out.println("");

  for(int i=0;i<array.length;i++)       //输出数组的情况

  {

  if(temp[i]==1)

  {

  array2[p]=array[i];

  System.out.print(array2[p]+"、");

  p++;

  }

  }

  System.out.println("");

  System.out.println("可能次数为:"+key);

  }

  }

  这个程序采用了一个临时的temp数组,被选中的置1,没有被选中的置0;然后扫描临时数组,发现10就置为01,并且返回位置信息position,以便进行把position左边的1全部放到数组的最左端,这段程序还有一个大的难点就是,判断循环最后的一个条件。这个条件就是扫描从size-numbers开始到size结束时的后面的数组中没有一个0就是最后一个可能的组合。

  通过上面简短的介绍,再加上程序的理解,大家应该可以看的懂这段代码。本代码是放在myeclipse 10中写的,绝对可以跑的起来。这些都是本人一个键一个键敲出来的,希望大家顶一下,尊重一下劳动成果。如果有更好的意见,希望能够联系我。



相关评论