1.题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串 abc,则输出由字符 a、b、c 所能排列出来的所有字符串
abc、acb、bac、bca、cab 和 cba。
//一种递归实现
void Permutation(char* pStr, char* pBegin) { if (*pBegin == '\0') puts(pStr); else { for (char* pCh = pBegin; *pCh != '\0'; ++pCh) { char chTmp = *pCh; *pCh = *pBegin; *pBegin = chTmp; Permutation(pStr, pBegin + 1); chTmp = *pCh; *pCh = *pBegin; *pBegin = chTmp; } } } int Permutation(char* pStr) { int nRet = 0; if (pStr == NULL) { nRet = -1; printf("param input error!\n"); return nRet; } Permutation(pStr, pStr); return nRet; } //for(char* pCh = pBegin; *pCh != '\0'; ++pCh); //FUCK的在这里加了一个 ;(语句结束的符号), //怎么调试都出现怪异的情况,程序崩溃,而且走到 //for循环里面会报出pCh未定义,而且跟踪断点,发现pStr,pBegin //指向的字符串都为空值。这说明作用域结束,出栈了。 //以后再次碰到这种情况要想想是不是语法哪里错了。 //而且这种错误最坑爹的是编译器检查不出来! //另一种递归实现 void CalcAllPermutation(char perm[], int first, int num) { if (num <= 1) //刚开始写成了num < 1也是可以的,出结果了,很正确 { puts(perm); return; } else { for (int i = first; i < first + num; ++i) { swap(perm[i], perm[first]); CalcAllPermutation(perm, first + 1, num - 1); swap(perm[i], perm[first]); } } }
关于num < 1也是可以的,出结果了,很正确。如果num=1时还可以继续下面的循环递归,此时first=3,num=0,i<first+num(3<3)不成立,然后退出这一层递归。这相当于多执行了for循环中的条件判断操作!
2.题目:求组合数:求N个数(1...n)中K个数的组合....如:
Combination(5,3)
要求输出:543,542,541,532,531,521,432,431,421,431
int stack[3] = { 0 }; int top = -1; bool pop(int* nNum) { *nNum = stack[top--]; if (top >= 0) return false; else return true; } bool push(int nNum) { stack[++top] = nNum; if (top < 2) return false; else return true; } void Combination(int n, int m) { int temp = n; push(temp); while (1) { if (1 == temp) { if (pop(&temp) && stack[0] == m) break; } else if (push(--temp)) { printf("%d%d%d ", stack[0], stack[1], stack[2]); pop(&temp); } } }
原文:http://blog.csdn.net/bcypxl/article/details/34159813