算法----递归求子集

xiaoxiao2021-02-28  45

#include<stdio.h> #include<string.h> char s[50]; int index = 0;//标记选择后的字符下标 void reSort(char *pArray, int begin,int pLen , int len) { if (pLen == 0) { puts(s); return; } for (int i = begin; i < len; i++) { s[index++] = pArray[i]; reSort(pArray, i + 1, pLen - 1, len); index--; } } int main() { char str[] = "abcd"; int len = strlen(str); for (int i = 1; i <= len; i++) reSort(str, 0, i, len);//从0开始选i个字符 getchar(); return 0; } #include<stdio.h> #include<string.h> #include<stdlib.h> void print_allSubSet(char arr[], int n) { if (n > 30) { printf("%d is too big\n", n); return; } int total = (1 << n); // 1 << n ,n个元素共有2^n个子集,包括空集) for (int j = 0; j < total; j++) // 每循环一次选出一个子集 { printf("{ "); int i = 0; // 每一次循环,i都重新置0; int mask = j; // 序号j对应的是第(j+1)个子集。 while (mask > 0) // 通过移位的方式,直至mask的二进制形式中,所有位都为0。 { if (mask & 1) // 若mask的二进制形式的最后一位非0,输出该位对应的数字。 printf("%c", arr[i]); mask >>= 1; // mask右移一位 i++; } printf("}\n"); } } int main() { char arr[30] = "ABC";//000表示空集 //001表示只有D元素的集合 //111表示集合ABC print_allSubSet(arr,strlen(arr)); getchar(); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2622469.html

最新回复(0)