资源简介
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
相关资源
- c语言定时关机
- 六角网格(Introduce to Hexagonal Grids.)
- C++实现经纬度与公里网的装换
- 泥人MCP2515模块-拓展帧例程(STC89)
- 语音代码论文:CSR86708675DSP算法EQ动态
- c++ 统计素数并求和
- nRF52 BLE配置(main.c)
- 硬盘检查实用代码(hdd_check.c)
- FFT 快速傅里叶变换C++实现
- 大话设计模式源码(C++)
- MFC共享内存的
- flac二次开发
- 凸包(c++入门级)
- ksj转opencv(USB相机图像数据转OPENCV)
- c++ 贪吃蛇代码(.cxx)
- 点云PCL三维重建
- C++OpenCV实现数字识别
- vc++车牌识别源程序
- c++ 换肤窗口程序代码
- C++hello world
- VC++截屏,并截屏图像旋转(简单)
- 老外写的功能强大的文件查找工具(
- MFC获取电脑文件夹下文件的名称,类
- 3D测量 TCP通信
- 大华设备初始化(c++代码)
- c++ 定时关机 项目源码
- C++ GUI QT4 随书源码
- C++百米赛入门级
- 计算黄金分连数
- 练习用途,单词索引
评论
共有 条评论