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中写的,绝对可以跑的起来。这些都是本人一个键一个键敲出来的,希望大家顶一下,尊重一下劳动成果。如果有更好的意见,希望能够联系我。
分享到:
相关推荐
计算数字排列组合,可以组合出任意数字的组合
排列组合 排列 组合 java排列组合算法 排列组合算法
从n个数组中取出所有排列组合(Java实现)
java m取n 重复 不重复 排列组合 for循环嵌套递归
6位数,共有几种排列组合的算法,java实现
Java排列组合_组合算法,利用list及set的无序性, 通过递归实现,不同于以往的排列组合 自娱自乐
Java排列组合源码实例,对已知数进行最大限度组合,有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不...
Java排列组合算法 - 郭睿的专栏 - CSDN博客Java排列组合算法 - 郭睿的专栏 - CSDN博客
Java排列组合算法
排列组合公式排列组合计算公式[规整].pdf
文档讲解了排列组合的基本概念,包括如何计算阶乘、如何生成排列和组合,以及如何将这些概念应用于解决实际问题。 此外,文档还提供了各种排列组合算法的详细代码示例和实现细节,包括递归和迭代方法。文档还涵盖了...
本资源附带文档解释了排列组合算法的实现和原理。其中排列算法是基于递归实现的,组合算法是基于高效的位移法实现的。代码是使用Java版实现的。
自己用Delphi写的一个小工具,可以计算170以内的阶乘、排列组合。
脚本根据指定的数字对计算所有的组合,如指定7和5,则计算7选5进行组合,即C5/7
主要介绍了C#实现排列组合算法的完整实例,文中实例主要展示了排列循环方法和排列堆栈方法,需要的朋友可以参考下
用JAVA来计算并按条件来排列时间 现在把符合奇偶数排列的时间排列出来
该文档对排列组合问题的算法设计问题进行一系列讲述
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
使用java找出N项中的M项的排列结果、组合结果。从列表List或者Array中找出n项得到的排列、组合结果——排列A(n,m),组合C(n,m)
排列组合生成器,支持筛选,存储采用h2数据库,后台采用springboot框架