手机
当前位置:查字典教程网 >编程开发 >C语言 >排列组合总结:将结果进行输出的实现方法
排列组合总结:将结果进行输出的实现方法
摘要:全排列输出:解法一:复制代码代码如下:#include/*递归思想:取出数组第一个元素放到最后一个元素即a[0]和a[n]交换然后一次递归a...

全排列输出:

解法一:

复制代码 代码如下:

<SPAN>#include <stdio.h>

/*

递归思想:

取出数组第一个元素放到最后一个元素 即a[0] 和a[n]交换 然后一次递归a[n] 个元素的全排列

1 如果数组只有一个元素 n=1 a={1} 则全排列就是{1}

2 如果有两个元素 n=2 a={1,2} 则全排列是

{2,1} a[1]与a[2]交换 交换后求a[2-1]={2}的全排列 归结到 1

{1,2} a[2]与a[2]交换 交换后求a[2-1]={1}的全排列 归结到 1

3 如果有三个元素 n=3 a={1,2,3} 则全排列是

{{2,3},1} a[1]和a[3]交换 交换后求a[3-1]={2,3} 的全排列 归结到 2

{{1,3},2} a[2] a[3] 交换 交换后求 a[3-1]={1,3} 的全排列 归结到 2

{1,2},3} a[3] a[3] 交换 交换后求 a[3-1]={1,2} 的全排列 归结到 2

*/

void swap(int a[],int size)

{

int i,t;

if(size==0)

{

for(i=0;i<5;i++)

{

printf("%c ",a[i]);

}

printf("n");

return;

}

else

{

for(i=0;i<=size;i++) //元素 进行全部循环

{

//写在swap()之前,进行递归传值 出口点要传入函数

t=a[i];a[i]=a[size];a[size]=t;

swap(a,size-1);

//数组元素还原 开始是什么 现在还是什么 位置改变后 变成原来位置

// 便于从a[1] 到a[n] 和最后一个元素交换位置

t=a[i];a[i]=a[size];a[size]=t;

}

}

}

int main()

{

int a[5],i;

for(i=0;i<5;i++)

{

a[i]=97+i;

}

swap(a,4);

//printf("n%d",m);

return 0;

}</SPAN>

解法二:

复制代码 代码如下:

<SPAN>#include <stdio.h>

//思路 分别求出以1 2 3 4 5 开头 剩下数字的全排列 一直到简化为一个数字

void swap(int a[],int k)

{

int i,m,t=0;

if(k==5)

{

for(i=0;i<5;i++)

{

printf("%d ",a[i]);

}

//k++;

printf("n");

}

for(i=k;i<5;i++)

{

{m=a[k];a[k]=a[i];a[i]=m;}

swap(a,k+1);

{m=a[k];a[k]=a[i];a[i]=m;}

}

}

int main()

{

int a[5]={1,2,3,4,5}; //进行递归运算的数值

swap(a,0); //函数调用

return 0;

}

</SPAN>

m个数中取n个进行排列:

复制代码 代码如下:

#include <stdio.h>

void swap(int a[],int b[],int i,int size)

{

int k,j,temp;

if(i==3)

{

for(k=0;k<3;k++)

{

printf("%d ",b[k]);

}

printf("n");

return;

}

else

{

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

{

b[i]=a[j];

temp=a[j];a[j]=a[size-1];a[size-1]=temp;

swap(a,b,i+1,size-1);

temp=a[j];a[j]=a[size-1];a[size-1]=temp;

}

}

}

int main()

{

int a[5]={1,2,3,4,5},b[3];//求5个数中三个数的全排列

swap(a,b,0,5);

return 0;

}

m个数取n个进行组合:

[10反转置换法]

算法思想:

(1) 初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。

(2) 从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。

(3) 重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能

复制代码 代码如下:

#include <stdio.h>

#include <stdlib.h>

void putout(int * num,int m)

{

int i;

for(i=0;i<m;i++)

{

if(*(num+i))

printf("%d ",i+1);

}

printf("n");

}

int check(int *num,int m,int n)

{

int flag=1,i;//当flag=1时,继续while循环 反之,退出循环

for(i=0;i<m-n;i++)

{

if(*(num+i))

{

return 1;

}

}

return 0;

}

void choseNum(int *num,int m,int n)

{

int i,j;

putout(num,m); //输出第一个组合

while(1)

{

int count=0; //注意count位置 就他调试了半天

//找第一个1 0组合

for(i=0;i<m-1;i++)

{

if(*(num+i)==1&&*(num+i+1)==0)

{

*(num+i)=0;

*(num+i+1)=1;

break;

}

if(*(num+i)) //统计前面出现出现1的次数

count++;

}

for(j=0;j<i;j++)

{

if(j<count) //将前面几个数全为1

{

*(num+j)=1;

}

else //后几个数为0

{

*(num+j)=0;

}

}

putout(num,m);

if(check(num,m,n)!=1)

break;

}

free(num);

}

int main()

{

int m,n;//从m个数中找n个求组合

printf("从m个数中n个数的组合:");

scanf("%d %d",&m,&n);

int *num,i;

//int count;

num=(int *)malloc(sizeof(int)*m);

for(i=0;i<m;i++)

{

if(i<n)

*(num+i)=1;

else

*(num+i)=0;

}

choseNum(num,m,n);

return 0;

}

结果实例:

排列组合总结:将结果进行输出的实现方法1

【排列组合总结:将结果进行输出的实现方法】相关文章:

让应用程序只运行一个实例的实现方法

C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

将正小数转化为2-9进制小数的实现方法

给ActiveX签名的实现方法详解

深入线性时间复杂度求数组中第K大数的方法详解

解决C++中事件不响应的方法详解

用typedef定义类型的总结分析

解析在Direct2D中画Bezier曲线的实现方法

判断机器大小端的两种实现方法

判断整数序列是否为二元查找树的后序遍历结果的解决方法

精品推荐
分类导航