`
he91_com
  • 浏览: 377157 次
文章分类
社区版块
存档分类
最新评论

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中写的,绝对可以跑的起来。这些都是本人一个键一个键敲出来的,希望大家顶一下,尊重一下劳动成果。如果有更好的意见,希望能够联系我。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics