#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/*
* 加1后进位操作
* 用字符串模拟数字的进位操作
*/
void add_one(int *array, int array_len, int radio, int *flow)
{
int i;
for ( i=array_len-1; i>=0; i-- )
{
array[i] += 1;
//没有进位就退出
if (array[i] < radio) return; else array[i] = 0;
}
// 最高位溢出 - 标志进位操作已经结束
(*flow) = 1;
}
/*
* 获取全排列
*/
int get_pailie(int set[], int set_len, int sub_len, int out_len)
{
int end_flag = 0;
int *array = NULL;
int i = 0;
if ( NULL==set || out_len<sub_len ) return -1;
if ( (array=(int *)malloc(sub_len * sizeof(int))) == NULL ) return -2;
// 初始化整数集合为0
for( i=0; i<sub_len; i++ ) array[i] = 0;
while( 1 != end_flag )
{
for(i=0; i<sub_len; i++) printf("%4d", set[array[i]]);// 输出结果的每一位与它对应的数的每一位相同
printf("\n");
// 下标+1
add_one(array, sub_len, set_len, &end_flag);
}
free(array);
return 0;
}
int main()
{
int set[]={1,-1};
int set_len = 2;
int sub_len = 4;
get_pailie(set, set_len, sub_len,sub_len);
return 0;
}
1 1 1 1
1 1 1 -1
1 1 -1 1
1 1 -1 -1
1 -1 1 1
1 -1 1 -1
1 -1 -1 1
1 -1 -1 -1
-1 1 1 1
-1 1 1 -1
-1 1 -1 1
-1 1 -1 -1
-1 -1 1 1
-1 -1 1 -1
-1 -1 -1 1
-1 -1 -1 -1