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

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);
 }
}

 

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值