Skip to content

Instantly share code, notes, and snippets.

@shihongzhi
Created April 3, 2012 06:04
Show Gist options
  • Save shihongzhi/2289669 to your computer and use it in GitHub Desktop.
Save shihongzhi/2289669 to your computer and use it in GitHub Desktop.
Combination
#include <stdio.h>
#include <string.h>
//排列,用的是非递归方法,即2进制方法
char letter[] = "abcdefg";
int main()
{
int number = 1<<7;
int index, cur;
for (int i=1; i<number; ++i)
{
char tmp[] ="";
index = 0;
cur = i;
while (cur)
{
if (cur&1)
{
strncat(tmp, &letter[index], 1);
}
index++;
cur = cur>>1;
}
printf("%s\n", tmp);
}
return 0;
}
@shihongzhi
Copy link
Author

#include <vector>
#include <stdio.h>

using namespace std;
//需要格式化输出  answer to http://hi.baidu.com/zaigelinux/blog/item/1fab6ea97f3021154a36d63b.html
void PrintCombination(char str[], int len, vector<char>& result, int *first)
{
    if (len == 0)
    {
        vector<char>::iterator it = result.begin();
        if (*first)
            *first = 0;
        else
            printf(",");
        printf("(");
        for (; it<result.end(); ++it)
        {
            printf("%c", *it);
        }
        printf(")");
        return;
    }
    if (!*str)
        return;
    result.push_back(*str);
    PrintCombination(str+1, len-1, result, first);
    result.pop_back();
    PrintCombination(str+1, len, result, first);
}

void Combination(char str[])
{
    if(!str || !*str)
        return;
    int len = strlen(str);
    vector<char> result;
    int first; //用来判断是否是第一个组合,判断是否print ","
    for (int i=1; i<=len; i++)
    {
        first = 1;
        PrintCombination(str, i, result, &first);
        printf("\n");
    }
}


int main()
{
    char letter[] = "abcdefg";
    Combination(letter);
    return 0;
}

@shihongzhi
Copy link
Author

//usage:
//char letter[] = "abc";
//Arrange(letter, letter);
void Arrange(char *str, char *start)
{
    if (!*start)
    {
        printf("%s\n", str);
        return;
    }
    for (char *i=start; (*i)!='\0'; i++)  //基本思想是
    {
        char tmp = *start;
        *start = *i;
        *i = tmp;
        Arrange(str, start+1);
        tmp = *start;
        *start = *i;
        *i = tmp;
    }
}

void Arrange(char *str)
{
    Arrange(str, str);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment