前言
“递归”不愧是它,总是这么让人烧脑,一次都没令人失望过🙃,这次的题目是五人捕分鱼。和之前做的递归的题目又有点不相同。
正文
A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?
关键
许多人第一次得出的答案是3960吧,一是没弄清楚递归本体,二是缺少考虑了下一个人分的鱼数n要满足(n-1)/5*4%5==0,也就是下一个数要能被5整除。
代码一
#include <stdio.h>
#include <stdlib.h>
int finish(int n,int x);
void main(){
int i=0,sum,flag=0;
do{
sum=5*i+1;//鱼的总数
i=i+1;//记次数,无实际意义
if(finish(5,sum)){
flag=1;
printf("五个人合伙捕到的鱼总数为:%d",sum);
}
}while(!flag);
}
/*n为人数,x为鱼的总数*/
int finish(int n,int x){
if((x-1)%5==0){//次数要能被5整除
if(n==1)
return 1;//递归出口
else{
return finish(n-1,(x-1)/5*4);
}
}
return 0;//若不满足条件,则返回0
}
代码二
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int finish(int n,int time);
int main()
{
int i=0;
int flag=0;
while(!flag){
i++;
flag=finish(i*5+1,0);
}
printf("%d",i*5+1);
}
/*time 为分鱼次数,n为鱼的数量*/
int finish(int n,int time)
{
if(time==5){
//printf("%d",n);
return 1;
}
if((n-1)%5==0){
return finish((n-1)/5*4,time+1);
}
return 0;
}
代码三(非递归)
/*渔夫捕鱼问题C实现*/
#include<stdio.h>
int main(void){
int n,x,flag;
for(n=6;flag;n++){ //由于最后一人最少需要6条鱼,所以循环从6开始*/
x=n;
int i=0;
while(i<5){ //总共5人所以判断5次
if((x-1)%5==0){ //判断该数是否合适
flag=0;
x=(x-1)/5*4; //一人分完后剩余鱼的总数
}
else {
flag=1; //不合适跳出判断循环,继续下一个数
break;
}
i++;
}
}
printf("捕到的鱼总量为:%d\n",n);
return 0;
}
源:https://www.cnblogs.com/dennis-wong/p/4121325.html