演算法----遞迴求子集
阿新 • • 發佈:2019-01-10
#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; }