全排列生成算法:(递归版)
/*
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 ;
}