分析:子集不是全排列,子集与二进制先关,
1.位向量法 b[i]做标记

#include<iostream> using namespace std; int b[100]={0}; void gcd(char *s,int n,int *b,int cur){ int i; if(cur==n){ for(i=0;i<n;i++) if(b[i]) printf("%c",s[i]); cout<<endl; return; } b[cur]=0; gcd(s,n,b,cur+1); b[cur]=1; gcd(s,n,b,cur+1); } int main() { int i,j; char s[100]; // int p[100]={0}; int n; cin>>n; for(int i=0;i<n;i++){ cin>>s[i]; } gcd(s,n,b,0); }
2.二进制法则

#include<iostream> using namespace std; void gcd(string s,int n){ int i,j; for(i=1;i<(1<<n);i++){ for(j=0;j<n;j++){ if(i&(1<<j)) cout<<s[j];//实验一下printf输出 // cout<<endl; } cout<<endl; } } int main() { int n,i,len; string s; while(cin>>s){ len=s.length(); gcd(s,len); } }