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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wx_hg1q2t6v 中级黑马   /  2014-12-31 23:17  /  2579 人查看  /  22 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

/*  A/B/C/D/E 5个人在某天夜里合伙去捕鱼,
     第二天,A第一个醒来,他将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份.
     B第二个醒来,也将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。
     C/D/E依次醒来,按同样的方法拿鱼。
     问他们合伙至少捕了多少条鱼?
*/

22 个回复

倒序浏览
递归这个有点难理解啊
回复 使用道具 举报
  1. #import <stdio.h>
  2. int main()
  3. {
  4.     for (int i = 6; ; ++i) // 死循环遍历
  5.     {
  6.         int j, m = i; // i是条数 交给m避免i值改变
  7.         for (j = 1; j <= 5; ++j) // 能成功分配五次
  8.         {
  9.             if ((m - 1) % 5 != 0) break; // 每次丢一条能分5份 否则不符合题意退出
  10.             m = (m - 1) / 5 * 4; // 下次的条数 = 这次分5份取四份
  11.         }
  12.         if (j == 6) // 跑完循环才能j=6
  13.         {
  14.             printf("%d\n", i); // 打印这个条数 退出
  15.             break;
  16.         }
  17.     }
  18.     return 0;
  19. }
复制代码
回复 使用道具 举报

他说的是递归,兄弟。0.0
回复 使用道具 举报
作为初学者来说。。试了一下午,用递归还真不会。。。
回复 使用道具 举报
花轮 来自手机 中级黑马 2015-1-1 23:31:38
地板
哟嘿 小红红你还在啊
回复 使用道具 举报
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼数,因为从递归的角度,要有明确的返回值,单纯无法判断明确的返回值,所以,还是三楼的方法是正解吧。。。 仅供参考的。。递归。。没技术含量
回复 使用道具 举报
回复 使用道具 举报
任冰冰 发表于 2015-1-1 21:35
他说的是递归,兄弟。0.0

{:3_60:}不要在意这些细节 递归不会做
回复 使用道具 举报
浅听 发表于 2014-12-31 23:44
递归这个有点难理解啊

恩  可以不用递归,已经做出来了,谢啦
回复 使用道具 举报
任冰冰 发表于 2015-1-1 21:35
他说的是递归,兄弟。0.0

感觉可以用递归,但是不会,,,,,,,
回复 使用道具 举报

why???????
回复 使用道具 举报
sunshine429 发表于 2015-1-1 23:35
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼 ...

也是一种方法,不过应该说明255的鱼是怎么来的:)
回复 使用道具 举报

思路清晰,给你点个赞!
回复 使用道具 举报
不错不错
回复 使用道具 举报
sunshine429 发表于 2015-1-1 23:35
总感觉这个题只能用三楼的方式解决比较合适。。。我是初学者不太会。。我是在三楼的基础上算得了E拿到的鱼 ...

已经很接近正确答案了。我感觉你的捕鱼方法里面放一个指针,每次调用方法时用指针记录上次的值,如果等于1了可以返回指针的值。我只是有这个想法,试试再说吧。
回复 使用道具 举报
wx_hg1q2t6v 发表于 2015-1-2 21:39
感觉可以用递归,但是不会,,,,,,,

递归就是方法调用自身,到一定条件才return吧。
回复 使用道具 举报
:):D楼主加油
回复 使用道具 举报
qyb1008 发表于 2015-1-2 22:34
已经很接近正确答案了。我感觉你的捕鱼方法里面放一个指针,每次调用方法时用指针记录上次的值,如果等于 ...

好吧,大家一起努力吧
回复 使用道具 举报

int main()
{   
    int totalFishNum = 0,i; //我们要试探进行所以需要一个变量假定捕鱼的总数量数量
    for (totalFishNum = 6; 1; totalFishNum++) {
        int flag = 1;  //我们还需要一个标记,如果我们试探出了一个合理的数字,用它来结束循环
        int leftFishNum = totalFishNum; //定义一个变量记录每次分鱼后剩下的条数,第一次分为捕鱼的数量
        for ( i = 1; i <= 5; i++)
                {            
            if ((leftFishNum - 1) % 5 == 0)//满足if条件说明第一次分配完成
            {
                leftFishNum = 4 * (leftFishNum - 1) / 5; //我们通过假设x的值  (x-1)/5 * 4
            }else
            {
                flag = 0; //如果不能被整除,就让我们的标记为0
                break; //结束当前循环
            }            
        }
        if(flag)
        {
            break;
        }
    }   
    printf("Total = %d\n",totalFishNum);     /*输出结果*/
}
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马