user-0 提问: 一道算法题

回复:
user: user-1
content: KISS － Keep It Simple, Stupid.

user: user-2
content: 没找出规律来。。。

user: user-0
content: 我找到一个规律，但是对最后两行数据不适用，很费解。 坐等坐等大神解惑

user: user-3
content: 不明白这种变化 有什么规律  不明觉厉

user: user-2
content: 引用 20 楼 zhao4zhong1 的回复:不用递归，用循环即可： #include <stdio.h> int i,a,b,c,d,e,f; int main() {     i=0;     for (a=0  ;a<28;a++) {     for (b=a+1;b<29;b++) {     for (c=b+1;c<30;c++) {     for (d=c+1;d<31;d++) {     for (e=d+1;e<32;e++) {     for (f=e+1;f<33;f++) {         printf("arrA[%2d,%2d,%2d,%2d,%2d,%2d]=arrB[%i]\n",a,b,c,d,e,f,i);         i++;     }     }     }     }     }     }     return 0; } //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, 7, 9,10]=arrB[5138] //…… //arrA[ 0, 1, 3,16,28,29]=arrB[7144] //…… //arrA[ 6,11,15,25,28,29]=arrB[854564] //…… //arrA[27,28,29,30,31,32]=arrB[1107567] 还是这个好，现在不方便写代码，只能借用老赵的代码了

user: user-4
content: 引用 23 楼 zhao4zhong1 的回复:纠正18楼，应该是6个。 是的看错了，是6-组合

user: user-4
content: 引用 18 楼 zhao4zhong1 的回复:求0..32中任取5个不重复的数且从小到大排列的所有解 这个就是N个数据的 r-组合  就是 0～32 这33个数据的 5-组合 搜到一篇博客   博客标题  如何求一个r组合的编号  http://blog.csdn.net/qq675927952/article/details/6539270 组合数学里r组合 是r-组合

user: user-1
content: 纠正18楼，应该是6个。

user: user-0
content: 引用 20 楼 zhao4zhong1 的回复:不用递归，用循环即可： #include <stdio.h> int i,a,b,c,d,e,f; int main() {     i=0;     for (a=0  ;a<28;a++) {     for (b=a+1;b<29;b++) {     for (c=b+1;c<30;c++) {     for (d=c+1;d<31;d++) {     for (e=d+1;e<32;e++) {     for (f=e+1;f<33;f++) {         printf("arrA[%2d,%2d,%2d,%2d,%2d,%2d]=arrB[%i]\n",a,b,c,d,e,f,i);         i++;     }     }     }     }     }     }     return 0; } //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, 7, 9,10]=arrB[5138] //…… //arrA[ 0, 1, 3,16,28,29]=arrB[7144] //…… //arrA[ 6,11,15,25,28,29]=arrB[854564] //…… //arrA[27,28,29,30,31,32]=arrB[1107567]  代码已看懂，这代码大赞 上面取5个不重复的数的所有解 、及序数 这些名词还有些费解，我再自己琢磨琢磨：） 还有一个疑惑，a-f明明是6个数字，怎么取的是5个不重复的数字呢？

user: user-4
content: 引用 15 楼 zheshiwodehao 的回复:[quote=引用 4 楼 lm_whales 的回复:] 看看是否 r-组合------按照大小顺序排列。 前面是组合，后面是序号，r = 5 如果是，求出全组合和序数的关系，就可以了 否则的话，这个规律就不好总结了。。 不过看着很像r-组合 冒昧问句“什么是r-组合”？[/quote] 赵老师都给出算法了，这个就不要太就关注了 简单说一下吧： r-组合就是 N个数里面取出 r个数的(全部)组合 和排列不同，组合是不考虑顺序的，就是说 0，1，2，3，4 和 4，1，3，2，0 是同一个组合，但是是两个排列。 r-组合 例如r=5 , 0，1，2，3，4 就是一个5组合。 0，1，2，3，4 //最小5个数 0，1，2，3，5 0，1，2，3，6 .。。。。。。。。  5，6，7，8，9  //最大5个数 这一系列 数据，是 0～9 个数的全部 5 组合。 这些算法导论，组合数学上都有介绍

user: user-1
content: 不用递归，用循环即可： #include <stdio.h> int i,a,b,c,d,e,f; int main() {     i=0;     for (a=0  ;a<28;a++) {     for (b=a+1;b<29;b++) {     for (c=b+1;c<30;c++) {     for (d=c+1;d<31;d++) {     for (e=d+1;e<32;e++) {     for (f=e+1;f<33;f++) {         printf("arrA[%2d,%2d,%2d,%2d,%2d,%2d]=arrB[%i]\n",a,b,c,d,e,f,i);         i++;     }     }     }     }     }     }     return 0; } //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, 7, 9,10]=arrB[5138] //…… //arrA[ 0, 1, 3,16,28,29]=arrB[7144] //…… //arrA[ 6,11,15,25,28,29]=arrB[854564] //…… //arrA[27,28,29,30,31,32]=arrB[1107567]

user: user-5
content: 引用 14 楼 zheshiwodehao 的回复:你的思路是对的，好像你忽略了一个条件 “ a<b<c<d<e<f”  我把代码改了下，逆向验证过来 arrA[ 0, 1, 4, 5, 6, 7] = arrB[7144]  应该是 arrA[ 0, 1, 4, 5, 6, 7] = arrB[7714]                                                           arrA[ 0, 1, 3, 4, 5, 7] = arrB[5138]  应该是 arrA[ 0, 1, 3, 4, 5, 7] = arrB[4061]

user: user-1
content: 求0..32中任取5个不重复的数且从小到大排列的所有解

user: user-1
content: 题目可以转化为求0..32中任取5个数且从小到大排列的所有解，将这个解也按从左到右，从小到大排列，排完后，求其序数和排列的对应关系的计算方法。  可以用递归的思路解决。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-5
content: 引用 14 楼 zheshiwodehao 的回复:[quote=引用 12 楼 user-5 的回复:] [quote=引用 10 楼 zheshiwodehao 的回复:] [quote=引用 8 楼 user-5 的回复:] 不好意思，前面错了，搞错的跳出循环的时机  arrB[854564]=arrA[4,14,15,17,21,28]         int index = n;         string strTemp = "arrB[" + index + "]=";          int intA = 0;         int intB = 1;         int intC = 2;         int intD = 3;         int intE = 4;         int intF = 5;          int intTemp = 0;         while (intA < 33)         {             while (intB < 33)             {                 while (intC < 33)                 {                     while (intD < 33)                     {                         while (intE < 33)                         {                             while (intF < 33)                             {                                 intF++;                                 intTemp++;                                 if (intTemp == index)                                 {                                     break;                                 }                             }                             if (intTemp == index)                             {                                 break;                             }                             intE++;                             intF = intE;                             //intTemp++;                         }                         if (intTemp == index)                         {                             break;                         }                         intD++;                         intE = intD;                         //intTemp++;                     }                     if (intTemp == index)                     {                         break;                     }                     intC++;                     intD = intC;                     //intTemp++;                 }                 if (intTemp == index)                 {                     break;                 }                 intB++;                 intC = intB;                 //intTemp++;             }             if (intTemp == index)             {                 break;             }             intA++;             intB = intA;             //intTemp++;         }          strTemp += "arrA[" + intA + "," + intB + "," + intC + "," + intD + "," + intE + "," + intF + "]";         lb.Text = strTemp; 我也写了一个类似的程序，不知你这个验证了上面的数据吗？我的程序最后两组数据验证是错误的。[/quote]  没有，刚才赶紧验证了下，发现自己太想当然了~MS是错误的~再想想先~[/quote] 你的思路是对的，好像你忽略了一个条件 “ a<b<c<d<e<f”[/quote]  嗯，修改过代码后和楼主一样了，也是最后两个验证有问题，其他都是正确的          int index =n;         int intA = 0;         int intB = 1;         int intC = 2;         int intD = 3;         int intE = 4;         int intF = 5;          string strTemp = "arrB[" + index + "]=";          for (int i = 1; i < index + 1; i++)         {             intF++;             while ((intB > 32) || (intC > 32) || (intD > 32) || (intE > 32) || (intF > 32))             {                 if (intF > 32)                 {                     intE++;                     if (intE > 32)                     {                         intD++;                         if (intD > 32)                         {                             intC++;                             if (intC > 32)                             {                                 intB++;                                 if (intB > 32)                                 {                                     intA++;                                     intB = intA + 1;                                 }                                 intC = intB + 1;                             }                             intD = intC + 1;                         }                         intE = intD + 1;                     }                     intF = intE + 1;                 }             }         }          strTemp += "arrA[" + intA + "," + intB + "," + intC + "," + intD + "," + intE + "," + intF + "]";         lb.Text = strTemp;  验证结果：   arrB[0]=arrA[ 0, 1, 2, 3, 4, 5]   arrB[1]=arrA[ 0, 1, 2, 3, 4, 6]   arrB[27]=arrA[ 0, 1, 2, 3, 4,32]  arrB[28]=arrA[ 0, 1, 2, 3, 5, 6]  arrB[29]=arrA[ 0, 1, 2, 3, 5, 7]  arrB[54]=arrA[ 0, 1, 2, 3, 5,32]  arrB[55]=arrA[ 0, 1, 2, 3, 6, 7]  arrB[406]=arrA[ 0, 1, 2, 4, 5, 6]  arrB[1135]=arrA[ 0, 1, 2, 6, 7, 8]  arrB[1460]=arrA[ 0, 1, 2, 7, 8, 9]   arrB[4060]=arrA[ 0, 1, 3, 4, 5, 6]  arrB[5138]=arrA[0,1,3,7,9,10] arrB[7144]=arrA[0,1,3,16,28,29]   规律应该是这个规律，最大的可能还是题错了，不一定是楼主写错了，可能题目本身就错了~

user: user-0
content: 引用 4 楼 lm_whales 的回复:看看是否 r-组合------按照大小顺序排列。 前面是组合，后面是序号，r = 5 如果是，求出全组合和序数的关系，就可以了 否则的话，这个规律就不好总结了。。 不过看着很像r-组合 冒昧问句“什么是r-组合”？

user: user-0
content: 引用 12 楼 user-5 的回复:[quote=引用 10 楼 zheshiwodehao 的回复:] [quote=引用 8 楼 user-5 的回复:] 不好意思，前面错了，搞错的跳出循环的时机  arrB[854564]=arrA[4,14,15,17,21,28]         int index = n;         string strTemp = "arrB[" + index + "]=";          int intA = 0;         int intB = 1;         int intC = 2;         int intD = 3;         int intE = 4;         int intF = 5;          int intTemp = 0;         while (intA < 33)         {             while (intB < 33)             {                 while (intC < 33)                 {                     while (intD < 33)                     {                         while (intE < 33)                         {                             while (intF < 33)                             {                                 intF++;                                 intTemp++;                                 if (intTemp == index)                                 {                                     break;                                 }                             }                             if (intTemp == index)                             {                                 break;                             }                             intE++;                             intF = intE;                             //intTemp++;                         }                         if (intTemp == index)                         {                             break;                         }                         intD++;                         intE = intD;                         //intTemp++;                     }                     if (intTemp == index)                     {                         break;                     }                     intC++;                     intD = intC;                     //intTemp++;                 }                 if (intTemp == index)                 {                     break;                 }                 intB++;                 intC = intB;                 //intTemp++;             }             if (intTemp == index)             {                 break;             }             intA++;             intB = intA;             //intTemp++;         }          strTemp += "arrA[" + intA + "," + intB + "," + intC + "," + intD + "," + intE + "," + intF + "]";         lb.Text = strTemp; 我也写了一个类似的程序，不知你这个验证了上面的数据吗？我的程序最后两组数据验证是错误的。[/quote]  没有，刚才赶紧验证了下，发现自己太想当然了~MS是错误的~再想想先~[/quote] 你的思路是对的，好像你忽略了一个条件 “ a<b<c<d<e<f”

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:推导不出来，严重怀疑楼主题抄错了。 题没有错的亲，我验证了除了最后两组数据外的所有数据；我在怀疑最后两组数据是错的，或者是我规律直接找错了，所以想请大家帮忙验证下

user: user-5
content: 引用 10 楼 zheshiwodehao 的回复:[quote=引用 8 楼 user-5 的回复:] 不好意思，前面错了，搞错的跳出循环的时机  arrB[854564]=arrA[4,14,15,17,21,28]         int index = n;         string strTemp = "arrB[" + index + "]=";          int intA = 0;         int intB = 1;         int intC = 2;         int intD = 3;         int intE = 4;         int intF = 5;          int intTemp = 0;         while (intA < 33)         {             while (intB < 33)             {                 while (intC < 33)                 {                     while (intD < 33)                     {                         while (intE < 33)                         {                             while (intF < 33)                             {                                 intF++;                                 intTemp++;                                 if (intTemp == index)                                 {                                     break;                                 }                             }                             if (intTemp == index)                             {                                 break;                             }                             intE++;                             intF = intE;                             //intTemp++;                         }                         if (intTemp == index)                         {                             break;                         }                         intD++;                         intE = intD;                         //intTemp++;                     }                     if (intTemp == index)                     {                         break;                     }                     intC++;                     intD = intC;                     //intTemp++;                 }                 if (intTemp == index)                 {                     break;                 }                 intB++;                 intC = intB;                 //intTemp++;             }             if (intTemp == index)             {                 break;             }             intA++;             intB = intA;             //intTemp++;         }          strTemp += "arrA[" + intA + "," + intB + "," + intC + "," + intD + "," + intE + "," + intF + "]";         lb.Text = strTemp; 我也写了一个类似的程序，不知你这个验证了上面的数据吗？我的程序最后两组数据验证是错误的。[/quote]  没有，刚才赶紧验证了下，发现自己太想当然了~MS是错误的~再想想先~

user: user-1
content: 推导不出来，严重怀疑楼主题抄错了。