• 五人分鱼


    /*

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

       假设 

       fun(1)

       fun(2) = ((fun(1) - 1) / 5) * 4 // 隐含 (fun(1) - 1) % 5 == 0

       fun(3) = ((fun(2) - 1) / 5) * 4 // 隐含 (fun(2) - 1) % 5 == 0

       fun(4) = ((fun(3) - 1) / 5) * 4 // 隐含 (fun(3) - 1) % 5 == 0   

       fun(5) = ((fun(4) - 1) / 5) * 4 // 隐含 (fun(4) - 1) % 5 == 0

       fun(6) = ((fun(5) - 1) / 5) * 4 // 隐含 (fun(5) - 1) % 5 == 0

     */


    /*
      自己尝试完善了分鱼的方法,(其实是两个人分的时候结果对不上= =),
      totalFish 要定义成person+1比较准确,然后后面能否分鱼判断的时候要加上一个条件:
        剩下的鱼扔掉一条后要足够分人份,即:leftFish - 1 >= person
    */
    1
    #include <stdio.h> 2 int shareFish(int person){ 3 //假设捕鱼6条(即是第一次分鱼至少要几条鱼) 4 int totalFish = person+1; 5 //计数器,往上叠加鱼的数目直至条件成立 6 for (int i = totalFish; 1; i++) { 7 //记录剩下的鱼数 8 int leftFish = i; 9 //假设找到了这个数字 10 int isFind = 1; 11 //分五次鱼 12 for (int j = 0; j < person; j++) { 13 //尝试能否分出鱼,鱼至少要够人份 14 if ((leftFish - 1 ) % person == 0 && leftFish - 1 >= person) { 15 //计算分鱼之后的鱼数目 16 leftFish = (( leftFish - 1 ) / person ) * ( person - 1 ); 17 }else{ 18 //如果不能分就跳出循环(表示没找到) 19 isFind = 0; 20 break; 21 } 22 } 23 //如果可以分就跳出循环 24 if (isFind) { 25 totalFish = i; 26 // printf("%d",i); 27 break; 28 } 29 } 30 return totalFish; 31 } 32 33 int main(){ 34 //五个人分鱼,呵呵,把'5'改掉想几个人就几个人分! 35 int total = shareFish(5); 36 printf("%d",total); 37 return 0; 38 }
  • 相关阅读:
    递归删除文件夹及文件的方法
    12个国外优秀.Net开源项目
    ASP.NET刷新页面的六种方法
    C#实现多语言界面程序
    HyperLink 传参数要使传递的参数为字符串
    实现本地化多语言
    安卓开发学习
    Ajax异步处理当用户申请新用户
    3D MAX 介绍
    Ajax 用户登录验证
  • 原文地址:https://www.cnblogs.com/glchan/p/4799781.html
Copyright © 2020-2023  润新知