全排列生成算法:(递归版)
/*
3
123
132
213
231
312
321
*/
/*
1-M 的全排列
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 101
long total = 0 ;
int m;
int flag[MAX] = {0} ;
int save[MAX] = {0} ;
void find ( int num)
{
int i,j ;
if ( num > m )
{
total ++ ;
printf("==========NO.%d=========== ",total);
for(j=1 ; j<= m ; j++)
printf("%d",save[j]);
printf(" ");
}
else
{
for(i=1 ; i<= m ; i++)
if ( !flag[i] )
{
flag[i] = 1 ;
save[num] = i ;
find (num+1);
flag[i] = 0 ;
save[num] = 0 ;
}
}
}
int main(void)
{
scanf("%d",&m);
find (1);
printf("total = %ld ",total);
system("pause");
return 0 ;
}
组合的求法:从1-M中选择N个不同的数,并输出.
/*
从1-M中选中选择不相同的N个数并输出
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 101
long total = 0 ;
int m,n;
int flag[MAX] = {0} ;
int save[MAX] = {0} ;
void find ( int num)
{
int i,j ;
if ( num > n)
{
total ++ ;
printf("==========NO.%d=========== ",total);
for(j=1 ; j<= n ; j++)
printf("%d",save[j]);
printf(" ");
}
else
{
for(i=1 ; i<= m ; i++)
if ( !flag[i] && i > save[num-1] )
{
flag[i] = 1 ;
save[num] = i ;
find (num+1);
flag[i] = 0 ;
save[num] = 0 ;
}
}
}
int main(void)
{
scanf("%d %d",&n,&m);
find (1);
printf("total = %ld ",total);
system("pause");
return 0 ;
}