从1~9中,选取N个数,计算选取方案总数。这是一个排列组合的简单应用C(9,N)。也可以增加限制,例如1和9不可以同时被选中。
穷举法
本文主要是以C、C++、QT为基础进行编程,运行前简单修改即可。测试入口函数为 void Test_CatchNums()。
static const int N = 5; static int g_count = 0;//用于统计结果 //增加限制(可选) bool Num_IsValid(int *pa) { bool bOne = false; bool bNine = false; int i =0; if(NULL == pa) { ERROR_DEBUG; return false; } while(i<N) { if(pa[i] == 1) { bOne = true; } if(pa[i++] == 9) { bNine = true; } } if(bOne && bNine) { return false; } return true; } //打印方案 void Num_Output(int *pa) { QString str; if(NULL == pa) { ERROR_DEBUG; return; } for(int i=0; i<N; i++) { str += QString::number(pa[i]); str += " "; } qDebug()<<str; } //从1~9中,选取N个数,计算选取方案总数 bool GetNums(int startNum, int numSum, int *pa, int aIndex) { if(NULL == pa || aIndex >= N) { ERROR_DEBUG; return false; } for(int i=startNum; i<=numSum; i++) { pa[aIndex] = i; if(aIndex < (N-1))//还没有找全 { if(!GetNums(i+1, numSum, pa, aIndex+1)) { return false; } } else//已找全 { //if(Num_IsValid(pa))//增加限制 g_count++; //Num_Output(pa);//打印输出 } } return true; } //测试入口函数 void Test_CatchNums() { int a[N]; GetNums(1, 9, a, 0);//计算有多少种选取方案 qDebug()<<"g_count: "<<g_count; }运行结果: g_count: 126 增加限制的运行结果: g_count: 91