首页 > 代码库 > 一道r组合题目
一道r组合题目
题目:
多维数组变一维数组,规则如下:
1. arrA[a,b,c,d,e,f] = arrB[n];
2. 要求a<b<c<d<e<f<33;
例如:
arrA[ 0, 1, 2, 3, 4, 5] = arrB[0]
arrA[ 0, 1, 2, 3, 4, 6] = arrB[1]
arrA[ 0, 1, 2, 3, 4,32] = arrB[27]
arrA[ 0, 1, 2, 3, 5, 6] = arrB[28]
arrA[ 0, 1, 2, 3, 5, 7] = arrB[29]
arrA[ 0, 1, 2, 3, 5,32] = arrB[54]
arrA[ 0, 1, 2, 3, 6, 7] = arrB[55]
arrA[ 0, 1, 2, 4, 5, 6] = arrB[406]
arrA[ 0, 1, 2, 6, 7, 8] = arrB[1135]
arrA[ 0, 1, 2, 7, 8, 9] = arrB[1460]
arrA[ 0, 1, 3, 4, 5, 6] = arrB[4060]
// arrA[ 0, 1, 3, 4, 5, 7] = arrB[5138]
//arrA[ 0, 1, 4, 5, 6, 7] = arrB[7144]
求:1. arrB[854564]=arrA[a,b,c,d,e,f]中的abcdef值
2. arrB[N] = arrA[a,b,c,d,e,f]中的abcdef表达式或者程序
分析:
题目可以看为求0..32中任取6个数且从小到大排列的所有解,每个解中的元素从小到大排列;
arrA[a,b,c,d,e,f]中的数据组合就是上述问题的一个解,arrB[n]中的n是这个解在所有解中的序数;
arrA[x1, x2, x3, x4, x5] = arrB[y]
其中,x1<x2<x3<x4<x5, y是这个解在所有解中的序数;
原问题就可以转换为,求 每个解 和 其序数 的对应关系。
代码实现:
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 int a, b, c, d, e, f; 4 double n = 0; 5 double cnt = 0; 6 a = 0; b = 1; c = 2; d = 3; e = 4; f = 5; 7 8 printf("输入n:"); 9 scanf("%lf", &n);10 11 while(f<=32 && cnt<n)12 {13 if (++f > 32)14 { 15 if (++e > 31)16 {17 if (++d > 30)18 {19 if (++c > 29)20 {21 if (++b > 28)22 {23 if (++a > 27)24 {25 printf("超出范围!\n");26 break;27 }28 else29 {30 b = a+1; c = b+1; d = c+1; e = d+1; f=e+1;31 }32 }33 else34 {35 c = b+1; d = c+1; e = d+1; f=e+1;36 }37 }38 else39 {40 d = c+1; e = d+1; f=e+1;41 }42 }43 else44 {45 e = d+1; f=e+1;46 }47 }48 else49 {50 f = e+1;51 }52 }53 cnt++;54 55 }56 57 printf("cnt:%1f\n", cnt);58 printf("a:%d b:%d c:%d d:%d e:%d f:%d\n", a, b, c, d, e, f);59 60 return 0;61 }
1 //引自csdn::zhao4zhong1 2 #include <stdio.h> 3 int i,a,b,c,d,e,f; 4 int main() { 5 i=0; 6 for (a=0 ;a<28;a++) { 7 for (b=a+1;b<29;b++) { 8 for (c=b+1;c<30;c++) { 9 for (d=c+1;d<31;d++) {10 for (e=d+1;e<32;e++) {11 for (f=e+1;f<33;f++) {12 printf("arrA[%2d,%2d,%2d,%2d,%2d,%2d]=arrB[%i]\n",a,b,c,d,e,f,i);13 i++;14 }15 }16 }17 }18 }19 }20 return 0;21 }22 //arrA[ 0, 1, 2, 3, 4, 5]=arrB[0]23 //arrA[ 0, 1, 2, 3, 4, 6]=arrB[1]24 //……25 //arrA[ 0, 1, 2, 3, 4,32]=arrB[27]26 //arrA[ 0, 1, 2, 3, 5, 6]=arrB[28]27 //arrA[ 0, 1, 2, 3, 5, 7]=arrB[29]28 //……29 //arrA[ 0, 1, 2, 3, 5,32]=arrB[54]30 //arrA[ 0, 1, 2, 3, 6, 7]=arrB[55]31 //……32 //arrA[ 0, 1, 2, 4, 5, 6]=arrB[406]33 //……34 //arrA[ 0, 1, 2, 6, 7, 8]=arrB[1135]35 //……36 //arrA[ 0, 1, 2, 7, 8, 9]=arrB[1460]37 //……38 //arrA[ 0, 1, 3, 4, 5, 6]=arrB[4060]39 //……40 //arrA[ 0, 1, 3, 7, 9,10]=arrB[5138]41 //……42 //arrA[ 0, 1, 3,16,28,29]=arrB[7144]43 //……44 //arrA[ 6,11,15,25,28,29]=arrB[854564]45 //……46 //arrA[27,28,29,30,31,32]=arrB[1107567]
相关:
如何求一个r组合的编号:http://blog.csdn.net/qq675927952/article/details/6539270
一道r组合题目