/*问题:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
分析:由于遵守统计学的原理,故每次输出的个数为2^n-1个,n为输入的字符串长度。这样就可以用二进制表示的方式来求解,
从1到2^n-1中每个数的二进制表示中1的位置即为要输出的字符串中的位置。
*/
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void PutAnswer(char *p,int n)
{
int i,j,k,count,d,t;
for(t=1;t<=(pow(2.0,n)-1);t++)
{
j=0,count=0,d=0;
i=t;
int *buf=(int *)malloc(n*sizeof(int));
while(i)
{
if(i%2==1)
{
buf[j]=1;
j++;
count++;
}
else
{
buf[j]=0;
j++;
}
i=i/2;
}
char *put=(char *)malloc((count+1)*sizeof(char));
put[count]=0;
for(k=0;k<n;k++)
{
if(buf[k]==1)
{
put[d]=p[k];
d++;
}
}
printf("%s\r\n",put);
free(buf);
free(put);
}
}
int main ()
{
char *p = "abcdefg";
int len=strlen(p);
PutAnswer(p,len);
p=NULL;
system("pause");
return 0;
}
/*如输入123,输出的为1,2,3,12,13,23,123;
二进制表示 输出
0001 1
0010 2
0011 12(第1和2位的数)下同
0100 3
0101 13
0110 23
0111 123
分析:由于遵守统计学的原理,故每次输出的个数为2^n-1个,n为输入的字符串长度。这样就可以用二进制表示的方式来求解,
从1到2^n-1中每个数的二进制表示中1的位置即为要输出的字符串中的位置。
*/
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void PutAnswer(char *p,int n)
{
int i,j,k,count,d,t;
for(t=1;t<=(pow(2.0,n)-1);t++)
{
j=0,count=0,d=0;
i=t;
int *buf=(int *)malloc(n*sizeof(int));
while(i)
{
if(i%2==1)
{
buf[j]=1;
j++;
count++;
}
else
{
buf[j]=0;
j++;
}
i=i/2;
}
char *put=(char *)malloc((count+1)*sizeof(char));
put[count]=0;
for(k=0;k<n;k++)
{
if(buf[k]==1)
{
put[d]=p[k];
d++;
}
}
printf("%s\r\n",put);
free(buf);
free(put);
}
}
int main ()
{
char *p = "abcdefg";
int len=strlen(p);
PutAnswer(p,len);
p=NULL;
system("pause");
return 0;
}
/*如输入123,输出的为1,2,3,12,13,23,123;
二进制表示 输出
0001 1
0010 2
0011 12(第1和2位的数)下同
0100 3
0101 13
0110 23
0111 123