列出排列组合2^n种可能的方法
2015-06-02 12:03
232 查看
被这个问题困扰了好久,只能做到输出n固定时的组合情况,今天看到了才恍然大悟,原来是用数字逻辑表示二进制数的方法来做的。
上代码:
#include "stdio.h" #include "math.h" int main() { int n, max, temp, i; printf("n:"); scanf("%d", &n); max = pow(2, n); while (--max >= 0) { i = 0; temp = max; while(temp) { printf("%d", temp % 2); i++; temp = temp / 2; } while(i++ < n) printf("0"); printf("\n"); } return 1; }
用短除法算出每一个二进制数。
但是从树的角度看,其“遍历”的顺序是从叶子到根,不能边循环边遍历。而且这样输出的2^n个数的顺序不对。所以增加一个数组,使其能按照降序输出:
#include "stdio.h" #include "stdlib.h" #include "math.h" int main() { static int n; int max, flex, i; printf ("n:"); scanf ("%d", &n); int *temp1 = (int*)malloc(n * sizeof(int)); int *temp2 = (int*)malloc(n * sizeof(int)); max = (int)pow(2, n); while (--max >= 0) { for (int k = 0; k < n; k++) { temp1[k] = temp2[k] = 0; } i = 0; flex = max; while (flex) { temp1[i] = flex % 2; flex = flex / 2; temp2[n-i-1] = temp1[i]; i++; } for (int k = 0; k < n; k++) { printf ("%d", temp2[k]); } printf ("\n"); } return 1; }
以上。
阅读更多相关文章推荐
- java实现中兴通讯笔试程序题,排列组合所有可能的密码
- PHP输出多个元素的排列或组合的方法
- 将1~6这6个数字按每行3个进行输出,输出时要求左边的数字比右边的大,上边的数字比下边的大,求出所有可能的填写方法并统计输出排列方法有多少种。
- 一种列出所有可能组合的算法
- 【排列组合】有序进行全排列的几种方法
- 输入一串不重复的字符串,列出所有可能的组合(java实现)
- 程序员面试金典——解题总结: 9.18高难度题 18.2编写一个方法,洗一副牌。要求做到完美洗牌,换言之,这副牌52!种排列组合出现的概率相同
- 使用php计算排列组合的方法
- 字符串所有可能的排列 例如abcd等等 递归算法和排列组合知识结合
- 【排列组合】有序进行全排列的几种方法
- 递归方法的使用之一 -- 用递归进行排列组合
- 程序员的数学 - 排列组合 - 解决计数问题的方法 - 阅读小结
- 排列组合总结:将结果进行输出的实现方法
- 生成组合和排列方法总结
- 46.排列的所有可能组合
- 由a-z、0-9组成的3位密码,列出并打印所有可能的密码组合
- php求数组全排列,元素所有组合的方法总结
- 比如“1,2,3....10”,1到10这10个数,显示他的所有可能组合情况(排列顺序无所谓)
- python以环状形式组合排列图片并输出的方法
- php求数组全排列,元素所有组合的方法