// 원소(n)들을 (r)개씩 묶었을때 나오는 부분집합들 출력
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void combination(char*, int, int, int, int, int*); // combination func..
int main()
{
int i,j, number ,*array;
//i = r , number = n
int c=0;//원소의 개수 = n
int next =0;
int nums = 0;
char a[100] = {0};
char *ap = a;
char ar[21]={0};
printf("수식[ex){a,s,d}3]을 입력하시오: ");
gets(a);
printf("input item number: ");
for(j=0;j<100;j++)// 문자 & 숫자 걸러내기위한 부분
{
if((a[j]>=65&&a[j]<=90)||(a[j]>=97&&a[j]<=122))
{
ar[next]=a[j];
next++;
}
else if((a[j]>=48&&a[j]<=57)||a[j]==0)
{
i=atoi(ap+j);
break;
}
}
while(1)// count 증가 부분
{
if(ar[c]==0)break;
c++;}
printf("%d\n",c);
printf("%d",i);
// create memory..
array = (int*)malloc(sizeof(int)*(c+1));
printf("\n* %d - combination >\n", i);
combination(ar, 0, 0, i, c, array);
printf("\n");
// getch();
free(array); // free memory..
return 0;
}
// recursive combination function..
void combination(char *ar, int now, int count, int step, int number, int* array)
{
int i;
*(array+count) = now;
if (count == step) // search r-combination ..
{
printf(" { %c", ar[*(array+1)-1]); // print frist item..
for (i = 2; i <= count; i++)
{
printf(", %c", ar[*(array+i)-1]); // print other item..
}
printf(" } "); // close..
return ;
}
// recursive routine..
for (i = now+1; i <= number; i++)
{
combination(ar, i, count+1, step, number, array);
}
}