利用Python/C语言解决分鱼问题

来源:互联网 发布:能装windows的平板 编辑:程序博客网 时间:2024/05/26 22:09
 A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?

设总共捕了x条鱼,每个人看到的鱼共有Xn条, 则:
X1=x
X2=(X1-1)/5*4

X3=(X2-1)/5*4
X4=(X3-1)/5*4
X5=(X4-1)/5*4
其中,(Xn-1)%5=0必定成立,即题中所提到的,扔掉一条,取五分之一。

那么就有x,使得递推所得到的项满足(Xn-1)%5=0即可。

C:

    #include<stdio.h>    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;  //所取数值不符合题意,返回main()重新取X    }    int main()    {        int i=0, flag=0, x=6;        do        {                    x+=5;//x的最小值为6,每次增加5            if(fish(5, x))             {                flag=1; //标记为1,使得循环结束                printf("五个人合伙捕到的鱼总数为%d\n", x);            }        }        while(!flag);          for (i=1;i<=5;i++){//输出每个人所看到的鱼的数量            printf("第%d个人看到的鱼有%d条\n",i,x);            x=(x-1)/5*4;        }        return 0;    }

Python:

def fish(n, x):    if (x - 1) % 5 == 0:        if n == 1:            return 1        else:            return fish(n - 1, (x - 1) / 5 * 4)    return 0x = 6while True:    x += 5    if fish(5, x) == 1:        print(x)        breakfor i in range(1, 6):    print("第{0}人看到的鱼有{1}条".format(i, x))    x = int((x - 1) / 5 * 4)
反向递推法:
解决E和D的问题(规模为2),就可以解决D和C的问题,也就是E、D、C的问题(规模为3),最后解决所有问题。
 由X(n+1)=(Xn-1)/5*4得,Xn=X(n+1)*5/4+1
C:

#include<stdio.h>int main(){    int fish[5], 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;    }    printf("总共有%d条鱼\n",fish[1]);     for(i=1; i<=5; i++)        printf("第%d个人看到%d条鱼\n", i, fish[i]);    return 0;}

Python:

fish = [0, 0, 0, 0, 1]i = 0while True:    fish[4] += 5    for i in range(3, -2, -1):        if fish[i + 1] % 4 != 0:            break        fish[i] = int(fish[i + 1] * 5 / 4 + 1)        if fish[i] % 5 != 1:            break    if i==-1:        breakprint("总共捕了",fish[0],"条鱼")for i in range(0, 5):    print("第{0}人看到{1}条鱼".format(i+1, fish[i]))


原创粉丝点击