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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuyang 中级黑马   /  2015-1-1 17:48  /  862 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*

C语言算法竞赛题目:捕鱼和分鱼

A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?

根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。

假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4*(X-1)/5。若X满足上述要求,则X就是题目的解。

1.分配的方式相同,即扔掉一条鱼后剩下的鱼正好分成五份,鱼的总数 -1 一定能被5整除
2.我们不知道鱼的总数是多少,那么就假定它是 x 条
3.一共对鱼进行了几次分配 一共5个人,每个人分配1次 一共分配了5次 for循环
4.至少捕了多少条鱼? 只要我们找出一个合理的数字比如所 6 条开始 一点一点增加鱼的数量
我们就要试探 for循环

x
x = ((x - 1) / 5) * 4
x = ((x - 1) / 5) * 4
x = ((x - 1) / 5) * 4
x = ((x - 1) / 5) * 4


*/

int leastFishNum(){
   
    int totalFishNum = 0; //我们要试探进行所以需要一个变量假定捕鱼的总数量数量
    //从6条鱼开始试探,
    for (totalFishNum = 6; 1; totalFishNum++) {
        int flag = 1;  //我们还需要一个标记,如果我们试探出了一个合理的数字,用它来结束循环
        //5个人一共分配了5次
        //我们把试探的值赋值给鱼的总量totalFishNum
        int leftFishNum = totalFishNum; //定义一个变量记录每次分鱼后剩下的条数,第一次分为捕鱼的数量
        for (int i = 1; i <= 5; i++) {
            
            //如果鱼的总数量减去1一定能被5整除
            if ((leftFishNum - 1) % 5 == 0)//满足if条件说明第一次分配完成
            {
                //经过了第一次分配,A拿走了它的那份
                //后面每一次分配都是,拿走第一份剩余四份
                //那么剩余的鱼 总数应该是
                leftFishNum = 4 * (leftFishNum - 1) / 5; //我们通过假设x的值  (x-1)/5 * 4
                // printf("total = %d\n", leftFishNum);
            }else
            {
                flag = 0; //如果不能被整除,就让我们的标记为0
                break; //结束当前循环
            }
            
        }
        
        //我们的flag 只有在找到了能够瞒住我们分配条件的第一个数出现的时候
        //也就是找到了最少要有多少鱼的时候才会为1
        if(flag)
        {
            break;
        }
    }
   
    //printf("Total = %d\n",totalFishNum);     /*输出结果*/
    return totalFishNum;
   
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马