依然是穷举,这些代码让人怀疑for循环天生就是为穷举而生!
题:从0~9的10个数字中,选出不重复的五位数,其个位数为奇数的可能为多少?
/*完整代码*/ #include <iostream> using namespace std; int a[5]={1,3,5,7,9}; int b[5]; int main() { int n=0; for(int i=0;i<5;i++)/*第5位*/ { b[4]=a[i]; for(int j=0;j<10;j++)/*第1位*/ { if(j!=0 && j!=b[4]) { b[0]=j; for(int k=0;k<10;k++)/*第2位*/ { if(k!=b[0] && k!=b[4]) { b[1]=k; for(int h=0;h<10;h++)/*第3位*/ { if(h!=b[0] && h!=b[1] && h!=b[4]) { b[2]=h; for(int g=0;g<10;g++)/*第4位*/ { if(g!=b[2] && g!=b[4] && g!=b[0] && g!=b[1]) { b[3]=g; n++; for(int v=0;v<5;v++) cout<<b[v]<<" "; cout<<endl; } } } } } } } } } cout<<n<<endl;/*13440种可能*/ return 0; }
第二种解法:递归搜索
#include <iostream> using namespace std; #define n 10 int count=0;/*计数*/ int a[5];/*存放排列的数组*/ int flag[10];/*状态数组*/ int b[10]={0,1,2,3,4,5,6,7,8,9};/*待排数据*/ void f(int m) { if(m==5) /*分配完毕*/ { if((a[4]%2)!=0)/*五位数中,末位为奇数*/ count++; if(a[0]==0 && (a[4]%2)!=0)/*减去首位为0的个数*/ count--; } else for(int i=0;i<10;i++)/*扫描状态数组*/ if(flag[i]==0) { a[m]=b[i]; flag[i]=1; f(m+1); flag[i]=0; } } int main() { f(0); cout<<count; return 0; }