A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ko889910 中级黑马   /  2015-3-1 20:30  /  1175 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
以下为某个帖子中给出的算法:
  1. int i,m,j=0,k,count;
  2. for(i=4;i<10000;i+=4)
  3.     { count=0;
  4.       m=i;
  5.       for(k=0;k<5;k++)
  6.          {
  7.           j=i/4*5+1;
  8.           i=j;
  9.           if(j%4==0)
  10.              count++;
  11.              else break;
  12.         }
  13.      i=m;
  14. if(count==4)
  15. {System.out.println("原有桃子 "+j+" 个");
  16. break;}
  17. }
复制代码
我有个异议,觉得第二个if的判断条件应该是count>=4
因为跳出第二层循环的条件是j%4!=0或者第二层循环的循环条件(即k=5)不符合 第一种跳出的count=4第二种跳出的count=5  你无法判断哪一种情况先出现啊
不知道各位有没有什么看法,一起交流下

12 个回复

倒序浏览
貌似没问题,正因为需要判断count=4或5,所以他来了一条if(count==4) 啊
回复 使用道具 举报
                int i;//表示第五只猴子操作完剩下的桃子树
                int m;//用于还原现场
                int j=0;//用于表示某只猴子操作完后的桃子树
                int k;//用于二层循环,一共要进行五次
                int count;//用于统计进行了几次二层循环
以上为各参数的意义
回复 使用道具 举报
fantacyleo 发表于 2015-3-1 20:53
貌似没问题,正因为需要判断count=4或5,所以他来了一条if(count==4) 啊

count=5的情况也是符合题意的啊 未必是count=4才能结束顶层循环啊
回复 使用道具 举报
学习了,,,,,,,,,
回复 使用道具 举报
ko889910 发表于 2015-3-1 21:02
count=5的情况也是符合题意的啊 未必是count=4才能结束顶层循环啊

我好像有点明白了。其实count=4的时候,就可以准备结束内循环了,只需要再执行一次内循环中的j=i/4*5+1,就得到了最终答案j。至于此时j%4结果如何已经不重要了。你说的是对的。
回复 使用道具 举报
没有注释的代码坚决不看。琢磨了下楼主给的题目,自己也写了个:
  1. for (int i=16; i<10_000; i+=20) {   //  留给第5只猴子的桃子至少有16只
  2.             
  3.             int monkey = 4,             //  第4只猴子面对
  4.                 total = i + i/4 + 1;    //  total只桃子
  5.             
  6.             while (0 == total%4) {      //  由于每只猴子都留下4堆桃子,所以留给2~5号猴子的桃子必须能被4整除
  7.                 monkey++;
  8.                 total = total + total/4 + 1;
  9.                
  10.                 if (1 == monkey) {
  11.                     System.out.println("找到解: " + total);
  12.                 }
  13.             }
  14.         }
复制代码
回复 使用道具 举报
学习一下,没看懂楼主的if(j%4==0) count++;   中的条件j%4==0是什么意思??
回复 使用道具 举报
本帖最后由 Gonnaloveu 于 2015-3-2 16:21 编辑
fantacyleo 发表于 2015-3-1 20:53
貌似没问题,正因为需要判断count=4或5,所以他来了一条if(count==4) 啊

竟然看楼主代码了.有必要写这么多么...最后一只猴子最少拿到1个桃子,有多少猴子循环多少次乘5加1不就行了么:L
  1.                 int i = 1;
  2.                 for (int x = 0; x < 5; x++) {
  3.                         i = i * 5 + 1;
  4.                 }
  5.                 System.out.println("至少有" + i + "个桃子");
复制代码



回复 使用道具 举报
Gonnaloveu 发表于 2015-3-2 16:19
竟然看楼主代码了.有必要写这么多么...最后一只猴子最少拿到1个桃子,有多少猴子循环多少次乘5加1不就行了 ...

你想得太简单了。最后一个人是可以1*5+1,但倒数第二个人不可能在丢掉一个、剩下的平均分5份拿走1份后剩下6个桃子啊。因为(x-1) / 5 * 4 = 6的解不是整数
回复 使用道具 举报
fantacyleo 发表于 2015-3-2 16:26
你想得太简单了。最后一个人是可以1*5+1,但倒数第二个人不可能在丢掉一个、剩下的平均分5份拿走1份后剩 ...

好吧 =.= 下一个猴子分的是剩下的 4/5 想错了
回复 使用道具 举报
第二层循环跳出的条件就是k=5,与count无关,跳出后再count的值,他求的是最少有多少个桃子,所以必须count=4,当判断外循环出现4的时候,外循环也结束了。不会再进行内循环了,也就不会出现count=5的情况。
第二个if如果count=5,那得出的值就不是桃子字最少的情况。
回复 使用道具 举报
蒋文辉 发表于 2015-3-2 20:46
第二层循环跳出的条件就是k=5,与count无关,跳出后再count的值,他求的是最少有多少个桃子,所以必须count= ...

跳出二层循环的条件不是只有k=5,还有j%4!=0
count=5是指第一只猴子操作前桃子数仍旧是4的倍数和是不是最少没有任何关系
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马