首页 > 编程知识 正文

排列组合 C语言实现

时间:2023-05-06 19:00:30 阅读:259293 作者:4728

#include <stdio.h>#include <stdlib.h>int array[] = {1,2,3,4};#define N 4#define M 3int results[N] = {0}; //保存已经找到的结果前缀数组int results_end = 0; //结果前缀数组有效数据下标int is_used[N] = {0}; //是否已经排列过了的标志/** * 排列 * @param deep 递归深度 * @param n 数组最大长度 */void perm(int deep, int n){ int i; if (deep > n) // 越界递归结束 { return; } if (deep == n) // 找到结果,打印,递归结束 { for (i = 0; i < n; i++) { printf("%d", results[i]); } printf("t"); return ; } for (i = 0; i < n; i++) { if (is_used[i] == 0) { is_used[i] = 1; results[deep] = array[i]; perm(deep+1, n); is_used[i] = 0; } }}/** * 组合 * @param deep 递归深度 * @param n 数组最大长度 * @param m 要查找的组合的长度 */void comb(int deep, int n, int m){ int i = 0; if (deep > n) // 越界递归结束 return ; if (results_end == m) // 找到结果,打印,递归结束 { for (i = 0; i < m; i++) { printf("%d", results[i]); } printf("t"); return ; } results[results_end++] = array[deep]; comb(deep+1, n, m); //向下一级递归 results_end--; comb(deep+1, n, m); //向下一级递归}int main(){ int i = 0; printf("全排列:n"); perm(0, N); printf("n1~%d的所有组合:n", N); for(i=1; i<=N; i++){ comb(0, N, i); } printf("n"); return 0;}

运行结果
[root@centos6 data]# gcc test.c
[root@centos6 data]# ./a.out
全排列:
1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
1~4的所有组合:
1 2 3 4 12 13 14 23 24 34 123 124 134 234 1234

始于2010-12-30,Tencent;更新至2016-06-02,杭州。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。