定义两个函数 分别输出m个数中n个数的排列 与组合,该怎么处理
定义两个函数 分别输出m个数中n个数的排列 与组合
例如 1 2 3 这三个数 两个数的排列与组合
排列: 1 2; 1 3;2 1; 2 3;3 1;3 3;
组合:1 2; 1 3; 2 3;
跪求编程原理 注意 是原理啊 即使没有代码 也行!!! 我要的是方法!!1
------解决方案--------------------
例如 1 2 3 这三个数 两个数的排列与组合
排列: 1 2; 1 3;2 1; 2 3;3 1;3 3;
组合:1 2; 1 3; 2 3;
跪求编程原理 注意 是原理啊 即使没有代码 也行!!! 我要的是方法!!1
------解决方案--------------------
- C/C++ code
#include <stdio.h> #include <stdlib.h> bool find_arr( int a[], int length , int value ) { for( int i = 0; i < length; ++i ) { if( a[i] == value ) return true; } return false; } int main() { int len; int *arr; int i = 0, j = 0; printf("input the array numbers: "); scanf("%d",&len); arr = new int[len]; for( i = 0; i < len; ++i ) { printf("input the %d number: ",i + 1); scanf("%d",&arr[i]); } printf("排列:"); for( i = 0; i < len; ++i ) { for( j = 0; j < len; ++j ) { if( arr[i] != arr[j] ) { printf("%d %d ;",arr[i],arr[j]); } } } printf("\n组合:"); for( i = 0; i < len; ++i ) { for( j = i + 1; j < len; ++j ) { printf("%d %d ;",arr[i],arr[j]); } } printf("\n"); return 0; }
------解决方案--------------------
------解决方案--------------------
- C/C++ code
/* 求(1...m)中,n个数的组合 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合, 同时将其左边的所有“1”全部移动到数组的最左端。 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。 例如求5中选3的组合: 1 1 1 0 0 //1,2,3 1 1 0 1 0 //1,2,4 1 0 1 1 0 //1,3,4 0 1 1 1 0 //2,3,4 1 1 0 0 1 //1,2,5 1 0 1 0 1 //1,3,5 0 1 1 0 1 //2,3,5 1 0 0 1 1 //1,4,5 0 1 0 1 1 //2,4,5 0 0 1 1 1 //3,4,5 */ #include <stdio.h> #include <malloc.h> //输出 void output(int *num, int m) { int i; for(i = 0; i < m; ++i) if(*(num+i) == 1) printf("%d ", i+1); printf("\n"); } //检测n个“1”是否全部移动到最右端 //是则返回1 int check(int *num, int m, int n) { int i, flag = 1; for(i = m-1; i > m-n-1; --i) { if(*(num+i) == 0) { flag = 0; break; } } return flag; } void chooseNum(int m, int n) { int *num, i, j, count; num = (int*)malloc(sizeof(int)*m); for(i = 0; i < n; ++i)//前n个元素置1 *(num+i) = 1; if(m == n) { output(num, m); return; } for(i = n; i < m; ++i)//后面m-n个元素置0 *(num+i) = 0; output(num, m); while(1) { count = 0; //找到第一个“10”组合后将其变为“01”组合 for(i = 0; i < m-1; ++i) { if(*(num+i) == 1 && *(num+i+1) == 0) { *(num+i) = 0; *(num+i+1) = 1; break; } if(*(num+i) == 1) ++count; } //将其左边的所有“1”全部移动到数组的最左端 for(j = 0; j < i; ++j) { if(j < count) *(num+j) = 1; else *(num+j) = 0; } output(num, m); if(check(num, m, n) == 1) break; } free(num); } int main() { int m = 3, n = 2; //scanf("%d%d", &m, &n); chooseNum(m, n); return 0; }