1000个鸡蛋放到10个箱子里 无论要多少个总能不打开箱子拿出来应该怎样去分据说有13种答案求解啊?( 二 )


个鸡蛋。看这个表达式就明显了,和二进制是同一原理。当鸡蛋总数不是1023的时候,可能有多解,但最简单的一个办法是削减最后一个箱子里的鸡蛋数。如本题,1000个鸡蛋的情况下,最后一个箱子装有489个。对于不大于511的数,由于不涉及最后一个箱子,所以情况和之前一样。大于511,比如说512,将其加上一个虚拟的“23”,这时最后一个箱子也由于加了这个“23”变为512。对处理后的数字——512+23=535——再应用以上的方法,535的二进制为1000010111,即1+2+4+16+512=535。再将两边虚拟“23”拿掉,得1+2+4+16+489=512。(《十万个为什么》是套好书……)
■网友
我想到的笨方法是 套十个For语句 每个决定每个箱子内的鸡蛋数量 在循环的时候限制:第i个循环的鸡蛋数要大于它外面的箱子中的鸡蛋数就这以及这题目的意思是要用十个数 保证对于1000内的任意一个数 都可以从这十个数里面找几个使它们和为这个数?(C_10^1 + C_10^2 +....+C_10^10 = 1024,好吧那好像就是这意思吧)如果是这个意思 那就把上面的“大于”该成“大于等于” 并且可以只有九个循环 第一个箱子里肯定只有一个鸡蛋 然后在最里面的循环里加限制条件....-----------排列组合数那里的函数要用到多维数组和指针吧K_1,...,k_10最好也用数组吧我编程基础不牢=。= 就帮你到这儿了。。。要是以后补上了 \u0026amp; 我想起来这道题了,就来写更好的答案哈。。。go_to_next = 0; //若当前这组数不满足条件,则go_to_next的值为1,转向下一组 test_sum = 1; //这个参数标记了从1到1000我们需要测试的每一个数,看是否这10个数之中存在某一组的和是test_nummatch = 0; //标记当前的test_num是否满足 add_num = 1; //在测试test_num是否可以被加出来的时候,依次去add_num个数来试 for(k_2=1;k_2\u0026lt;=1000;k_2++){ for(k_3=k_2;k_3\u0026lt;=1000;k_3++){ ... for(k_i=k_{i-1};k_i\u0026lt;=1000;k_i++){ ... for(k_9....) k_10=1000-k_1-...-k_9; if k_10\u0026lt;k_9 continue;//当前这一组数不算,进行下一组 for(test_num=1;test_num\u0026lt;=1000 \u0026amp; go_to_next=0;test_num++){ match=0; for(add_num=1;add_num\u0026lt;=10 \u0026amp; match=0;add_num++){ while(match=0){ 用排列组合数把C_10^{add_num}每一种可能的情况列出来, 看是否有可能当前这组数的和为test_num, 若满足,则令match=1,并且跳出while(match=0)这个循环 } } if match == 1 continue; else go_to_next = 1; } if go_to_next == 0 {打印当前这组值作为一种结果} } } .... } .... }}


推荐阅读