我想问问有m个数,如果任意输入n,可以实现m中取n的组合算法,数字不可以允许重复。比如有3个数1,2,3,n=3,则一共有123,132,213,231,312
我想问问有m个数,如果任意输入n,可以实现m中取n的组合算法,数字不可以允许重复。比如有3个数1,2,3,n=3,则一共有123,132,213,231,312,321种取法。即需要满足公式,A(m,n)=(m)!/(N-1)!
程序代码:
#include <stdio.h> int data[100] = {5,4,3,2,1}; bool foot[100] = {0}; int cool = 0; void com(int n,int k,int mem[],int depth,int begin) { int i,j; if(k == depth) { for(i = 0;i<k;i++) printf("%d ",mem[i]); cool++; printf("\n"); return ; } for(i = 0;i<n;i++) { if(!foot[i]) { foot[i] = true; mem[begin] = data[i]; com(n,k,mem,depth+1,begin+1); foot[i] = false; } } } int main() { int mem[100] = {0}; com(5,3,mem,0,0); return 0; }排列数
程序代码:
#include <stdio.h> int data[100] = {5,4,3,2,1}; bool foot[100] = {0}; int cool = 0; void com(int n,int k,int mem[],int depth,int begin,int pos) { int i,j; if(k == depth) { for(i = 0;i<k;i++) printf("%d ",mem[i]); cool++; printf("\n"); return ; } for(i = pos;i<n;i++) { if(!foot[i]) { foot[i] = true; mem[begin] = data[i]; com(n,k,mem,depth+1,begin+1,i+1); foot[i] = false; } } } int main() { int mem[100] = {0}; com(5,3,mem,0,0,0); return 0; }组合数