源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-12-19 01:30 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:排列组合总结:将结果进行输出的实现方法
[b]全排列输出:[/b] [b]解法一: [/b]
[u]复制代码[/u] 代码如下:
<SPAN style="COLOR: #333333">#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>
[b]解法二: [/b]
[u]复制代码[/u] 代码如下:
<SPAN style="COLOR: #333333">#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>
[b]m个数中取n个进行排列: [/b]
[u]复制代码[/u] 代码如下:
#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; }
[b]m个数取n个进行组合: [/b][10反转置换法] 算法思想:      (1)  初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。      (2)  从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。      (3)  重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能
[u]复制代码[/u] 代码如下:
#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; }
[b]结果实例: [/b] [img]http://files.jb51.net/file_images/article/201305/20130508160734.png[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部