#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