69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
void Comb(char array[], int n);
int main(void)
{
char array[] = {'A', 'B', 'C', 'D', 'E'};
Comb(array, 5);
return 0;
}
/* 全组合 */
/* 打印任意长度数组的全组合 */
/* 用数组模拟二进制加法,枚举所有二进制位为1的组合 */
void Comb(char array[], int n)
{
int i, k, flag;
int* buf;
buf = (int*) calloc(n, sizeof(int));
while (1) {
flag = 1;
for (i = 0; i < n; i++) {
/* 只要有一个二进制位为0,则继续执行加法操作 */
if (buf[i] == 0) {
flag = 0;
break;
}
}
if (flag) break;
for (i = 0; i < n; i++) {
k = 0;
buf[i] += 1;
if (buf[i] == 2) {
buf[i] = 0;
k = 1;
}
if (k != 1) break;
}
for (i = 0; i < n; i++) {
if (buf[i]) printf("%c", array[i]);
}
printf("\n");
}
}
输出结果:
A
B
AB
C
AC
BC
ABC
D
AD
BD
ABD
CD
ACD
BCD
ABCD
E
AE
BE
ABE
CE
ACE
BCE
ABCE
DE
ADE
BDE
ABDE
CDE
ACDE
BCDE
ABCDE
#include <stdio.h>
#include <stdlib.h>
void Comb(char array[], int n);
int main(void)
{
char array[10] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
Comb(array, 3);
return 0;
/***************************************
输出结果:
A
B
C
AB
AC
BC
ABC
***************************************/
}
/* 全组合 */
/* 打印任意长度数组的全组合 */
/* 二进制转化法,模拟手动按顺序枚举所有组合 */
void Comb(char array[], int n)
{
int i, j, m, flag, cnt;
int* buf;
buf = (int*) calloc(n, sizeof(int));
for (m = 1; m <= n; m++) {
/* 初始化 */
for (i = 0; i < n; i++)
buf[i] = i < m ? 1 : 0;
while (1) {
/* 输出一个组合 */
for (i = 0; i < n; i++)
if (buf[i]) printf("%c", array[i]);
printf("\n");
/* 检查是否已经列出所有的组合,如果后m位都为1,说明已列出所有组合 */
flag = 1;
for (i = n - m; i < n; i++) {
if (buf[i] == 0) {
flag = 0;
break;
}
}
if (flag) break;
/* 将右边第1个“10”组合变成“01” */
for (i = n - 1; i > 0; i--) {
if (buf[i] == 0 && buf[i - 1] == 1) {
buf[i] = 1;
buf[i - 1] = 0;
break;
}
}
/* 如果最后一位为1,则将右端所有连续的1移动到第i位之后,其它位设为0 */
if (buf[n - 1]) {
for (j = n - 1, cnt = 0; j > i; j--) {
if (buf[j] == 0)
break;
cnt++;
}
for (j = i + 1; j < n; j++) {
if (j < i + 1 + cnt)
buf[j] = 1;
else
buf[j] = 0;
}
}
}
}
}
void print(char array[], int print_len , char * last)
{
for( int i = 0 ; i < (print_len - 1 ) ; i++)
printf("%c" , array[i]);
printf("%c\n", *last);
}
void Comb(char array[], int n)
{
for( int i = 0 ; i < n ; i++ )
{
for( int last = i ; last < n ; last ++)
{
print(array , i + 1 ,&array[last] );
}
}
}
int main(void)
{
char array[] = {'A', 'B', 'C', 'D', 'E'};
Comb(array, 5);
return 0;
}