问题描述A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?

问题分析

假设5个人合伙捕了x条鱼,则“A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了”之后,还剩下4(x-1)/5条鱼。

这里实际包含了一个隐含条件:假设Xn为第n(n=1、2、3、4、5)个人分鱼前鱼的总数,则(Xn-1)/5必须为正整数,否则不合题意。(Xn-1)/5为正整数即(X〜l)mod5=0必须成立。

又根据题意,应该有下面等式:

X4=4(X5-1)/5

X3=4(X4-1)/5

X2-4(X3-1)/5

X1=4(X2-1)/5

则一旦给定X5,就可以依次推算出X4、X3、X2和X1的值。要保证X5、X4、X3、X2和X1都满足条件(Xn-1)mod5=0,此时的X5则为5个人合伙捕到的鱼的总条数。显然,5个人合伙可能捕到的鱼的条数并不唯一,但题目中强调了 “至少”合伙捕到的鱼,此时题目的答案唯一。该问题可使用递归的方法求解。

程序设计

在main()函数中构建一个不定次数的do-while循环。定义变量x表示5个人合伙可能捕到的鱼的条数,可以取x的最小值为6,让x值逐渐增加,x每一次取值,都增加5,直到找到一个符合问题要求的答案。由于题目中问“这5人至少合伙捕到多少条鱼”,而我找到的第一个x值就是5个人至少捕到的鱼的总条数。

通过这个循环,就可以对每一个的可能情况进行检查。当然,是通过调用分鱼的递归函数来进行检查的。

分鱼的递归函数如下:

fish()函数中包含了两个参数:n和x。n表示参与分鱼的人数,x表示n个人分鱼前鱼的总条数。这两个参数都是由main()函数中传递进来的。

根据前面的分析,当n=5时,(x-1)mod5==0必须成立,否则该x值不是满足题意的值,退出fish()函数,返回到main()函数,main()函数中再传递新的x值到fish中进行检验。如果(x-1)mod5==0条件成立,则要判断n=4时,(x-1)mod5=0条件是否成立,需要注意的是,此时的形参x是4个人分鱼前鱼的总条数,即f(5,x)递归调用f(4,(x-1)/5*4)。这样依次进行下去,直到n=1时,(x-1)mod5==0条件仍成立,则说明开始从main()函数中传递进来的x值是符合题意要求的一个值,可以逐层从递归函数中返回,每次返回值都为1,直至返回到main()函数。

下面是完整的代码:

#include

/*分鱼递归函数*/

int fish(int n, int x)

{

if((x-1)%5 == 0)

{

if(n == 1)

return 1;  /*递归出口*/

else

return fish(n-1, (x-1)/5*4);  /*递归调用*/

}

return 0;  /*x不是符合题意的解,返回0*/

}

int main()

{

int i=0, flag=0, x;

do

{

i=i+1;

x=i*5+1;  /*x最小值为6,以后每次增加5*/

if(fish(5, x))  /*将x传入分鱼递归函数进行检验*/

{

flag=1;  /*找到第一个符合题意的x则置标志位为1*/

printf("五个人合伙捕到的鱼总数为%d\n", x);

}

}

while(!flag);  /*未找到符合题意的x,继续循环,否则退出循环*/

return 0;

}

运行结果:

五个人合伙捕到的鱼总数为3121

知识点补充

本题还可以使用“递推法”来求解。下面先对递推法做下简介。

递推法:利用问题本身所具有的递推关系来求解。所谓的递推关系指的是:当得到问题规模为n-1的解后,可以得出问题规模为n的解。因此,从规模为0或1的解可以依次递推出任意规模的解。

下面是完整的代码:

#include

/*分鱼递归函数*/

int fish(int n, int x)

{

if((x-1)%5 == 0)

{

if(n==1)

return 1; /*递归出口*/

else

return fish(n-1, (x-1)/5*4); /*递归调用*/

}

return 0; /*x不是符合题意的解,返回0*/

}

int main()

{

int fish[6], i;

fish[5]=6;

while(1)

{

for(i=4; i>0; i--)

{

if(fish[i+1]%4!=0)

break;

fish[i]=fish[i+1]*5/4+1;

if(fish[i]%5!=1)

break;

}

if(i == 0)

break;

fish[5]+=5;

}

for(i=1; i<=5; i++)

printf("fish[%d]=%d\n", i, fish[i]);

return 0;

}

运行结果:

fish[1]=3121

fish[2]=2496

fish[3]=1996

fish[4]=1596

fish[5]=1276

c语言5个人分鱼程序题,C语言递归解决5人分鱼问题相关推荐

  1. C语言 | 两种方法解决五人分鱼

    A.B.C.D.E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉. 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份. B 第二个醒来,也将鱼分为 ...

  2. 使用c语言实现复数运算的程序,用C语言实现的复数运算程序设计

    用C语言实现的复数运算程序设计 电大理工 2009年3月 Study of Science and Engineering at RTVU. 第1期 总第238期 用C语言实现的复数运算程序设计 王彦 ...

  3. c语言怎么让他变成程序,用C语言编了个程序,怎样让它点击“下一步”后继续弹出窗口...

    可以参考下面的代码: #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, ...

  4. 百万富翁C语言程序题,c语言问题百万富翁大神们帮帮忙?C语言问题?

    相关问题 公历:2018年1月21日7:35农历:丁酉年腊月初五日辰时八字:丁酉|癸丑|癸丑|丙辰五行:火金|水土|水土|火土纳音:山下火|桑松木|桑松木|沙中土五行缺木 我们经常提到八字" ...

  5. java硬币兑换_java程序题:把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法...

    满意答案 alexjia301 2015.01.15 采纳率:42%    等级:6 已帮助:257人 123456789101112131415161718192021222324252627/** ...

  6. C语言实现与功能的程序,用C语言实现Ping程序功能

    2001 年 10 月 01 日 大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法.在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序. ping命令是 ...

  7. c语言密码锁门禁系统程序,基于C语言STC89C52单片机电子密码锁的系统设计与仿真...

    摘 要:介绍一种通过 Protues 软件成功仿真的电子密码锁的实现过程.它采用高可靠性的STC89C52单片机来实现*和密码酌识别,采用具备IC总线接田的EPROM芯片来完成密码的聋储,通过l602 ...

  8. C语言做一个表格的程序,用C语言画个简单表格

    今天见到个题目,就把他做了,题目如下: 在图形环境中很容易做出漂亮的表格.但在控制台环境中就比较困难了.有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看) +------ ...

  9. 用c语言写的电话簿的程序,用C语言散列表实现电话薄

    #用C语言散列表实现电话薄# 标题 #include#include#includetypedef struct node { char num[11],name[15],address[20],ci ...

最新文章

  1. net-tools 要被 iproute2 取代了
  2. ASP.net MVC基础
  3. 实验:交换机生成树协议STP--功能验证
  4. Hot Door CADtools (基础篇)
  5. 160 - 4 ajj.1
  6. python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作
  7. 数三角形(51Nod-2497)
  8. MIND多兴趣召回实战(一)
  9. java8中class怎么用_Java8中你可能不知道的一些地方之方法引用实战
  10. Django实现微信消息推送
  11. JS中的语音识别——Speech Recognition API
  12. virtualbox vdi extend the disk usage
  13. [2018.10.10 T2] 烯烃
  14. [JSON]2017年最新县及县以上行政区划代码
  15. web打印时,各种页面样式设置
  16. Java+学生信息管理系统+GUI+文件
  17. java猴子搬香蕉,趣味算法:猴子搬香蕉问题
  18. python论坛签到_Python 百度贴吧自动签到
  19. 面向6G的去中心化的人工智能理论与技术
  20. linux 电源管理 Generic PM之Suspend功能

热门文章

  1. 主流手持设备以及芯片
  2. 常用插接件2(DC 电源插头)
  3. MAC升级到10.12.4 SVN CornerStone 一直连接不上的问题 2017年5月16更新
  4. CSS-- 精灵图和字体图标
  5. 永信至诚:乌镇世界互联网大会闭幕 网络安全人的使命刚刚启航
  6. element ui 表格全选与否
  7. LeetCode第 844 题:比较含退格的字符串(C++)
  8. 2016即将结束,你的目标实现了吗?
  9. 【Python】配置Python环境
  10. 物理 Standby <-> Snapshot Standby