#include "stdio.h" #define swap(arr, i , j) { if ((i) != (j)) { int temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } void print_array(int *arr, int len) { int i; printf(" "); for(i =0; i < len; i++) { printf("%d ", arr[i]); } } int permutation(int *arr, int pos, int n) { int i; if (pos == n) { //递归结束条件 print_array(arr, n); return 0; } for(i = pos; i < n; i++) { swap(arr, i, pos);//某个数字交换到 pos 位置 permutation(arr, pos + 1, n); //对出pos 位置后面的数,进行一次全排列 swap(arr, i, pos);//复原原来的排列,准备交换下一个数到pos 位置。 } return 0; } int main(int argc, char *argv[]) { int n = 0; int i; int number[20]; //已经有2432902008176640000 种排列方法了,输出来也很难保存这样多的数据了,所以程序不能大于这个数字。 printf("input n: "); while (scanf("%d", &n)) { if (n < 1) { printf("n must big than zero. "); continue; } if (n > 20) { printf("n too big. "); continue; } for (i = 0; i < n; i++) { number[i] = i + 1; } permutation(number, 0, n); printf(" input n: "); } return 0; }
来至http://www.cnblogs.com/niniwzw/archive/2010/03/19/1689863.html