五人分鱼
五人分魚(yú)問(wèn)題
問(wèn)題描述:
A、B、C、D、E這5個(gè)人合伙夜間捕魚(yú),凌晨時(shí)都已經(jīng)疲憊不堪,于是各自在河邊的樹(shù)叢中找地方睡著了。第二天日上三竿時(shí),A第一個(gè)醒來(lái),他將魚(yú)平分為5份,把多余的一條扔回河中,然后拿著自己的一份回家去了;B第二個(gè)醒來(lái),但不知道A已經(jīng)拿走了一份魚(yú),于是他將剩下的魚(yú)平分為5份,扔掉多余的一條,然后只拿走了自己的一份;接著C、D、E依次醒來(lái),也都按同樣的辦法分魚(yú)。問(wèn)這5人至少合伙捕到多少條魚(yú)?每個(gè)人醒來(lái)后所看到的魚(yú)是多少條?
#include "stdio.h"int main() {int i=0; //假定最后一人拿到的魚(yú)double num[5],p[5];//num拿走前剩下的數(shù)量,p拿走的魚(yú)int camp;while(1){p[0]=i++;//窮舉最后一人拿走的魚(yú)num[0]=p[0]*5+1;int j;for(j=1;j<5;j++){p[j]=num[j-1]/4;//整型會(huì)自動(dòng)去尾真煩。所以定義了double類(lèi)型camp=p[j]; //目前我想出來(lái)的判斷是否為整num[j]=p[j]*5+1;if(p[j]!=camp || num[j-1]>num[j]){//printf("p[0]=%d跳出\n",(int)p[0]);//顯示循環(huán)用break;//如果魚(yú)不為整數(shù)或剩下的魚(yú)變多了,跳出}}if(j==5) {break;}}int j;for(j=0;j<5;j++){printf("還有%d條魚(yú);p[%d]拿走%d條。\n",(int)num[j],j,(int)p[j]);} }運(yùn)行結(jié)果:
還有1276條魚(yú);p[0]拿走255條。
還有1596條魚(yú);p[1]拿走319條。
還有1996條魚(yú);p[2]拿走399條。
還有2496條魚(yú);p[3]拿走499條。
還有3121條魚(yú);p[4]拿走624條。
解題思路:
每個(gè)人的操作都是在現(xiàn)有的魚(yú)數(shù)量上 扔掉一條,再均分為五份,取走一份。
得到關(guān)系式:
num[j]=p[j]*5+1 //醒來(lái)前的魚(yú)數(shù)量為拿走的5倍加1
p[0]必然存在最小整數(shù)解。
所以運(yùn)用累加窮舉出p[0],再判斷其它人是否符合實(shí)記情況。(魚(yú)取整數(shù)條)
在這遇到幾個(gè)問(wèn)題
- 求前一個(gè)人拿走魚(yú)的數(shù)量時(shí) “p[j]=num[j-1]/4”
原本定義int類(lèi)型,程序自動(dòng)去尾,不能判斷魚(yú)是否為整數(shù)。 - 判斷剩下的魚(yú)變多完全是多余的。
所以將 p[] ; num[] 都定義為了double類(lèi)型;引入了一個(gè)臨時(shí)比較用的int型 camp 。
其它大神的解法
#include<stdio.h> /分魚(yú)遞歸函數(shù)/int fish(int n, int x) {if((x-1)%5 == 0){if(n==1)return 1; /遞歸出口/elsereturn fish(n-1, (x-1)/5*4); /遞歸調(diào)用/}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; }原文: https://blog.csdn.net/wenpeng231/article/details/86634538
使用遞歸個(gè)人認(rèn)為有些復(fù)雜了,的確也能很好的解決問(wèn)題。
#include<iostream> using namespace std ; int main() {int num[5];for(int i=16;;i+=5){num[0]=i;int j;for(j=1;j<5;j++){num[j]=(num[j-1]-1)/5*4;if(num[j]%5!=1) break; }if(j<=4) continue;break; }for(int i=0;i<5;i++)cout << num[i] <<endl;return 0; }
原文:https://blog.csdn.net/h2017010687/article/details/82589038
代碼簡(jiǎn)潔,真正的大神啊!
直接使用剩下的魚(yú)的數(shù)量運(yùn)算,每次遞增5完全避免了出現(xiàn)小數(shù)的情況。
只是 i=16 我沒(méi)想明白是怎么來(lái)的。我只能理解從6開(kāi)始。
總結(jié)
- 上一篇: 各类指数数据(商品价格指数、消费者价格指
- 下一篇: macOS下OneNote中文字体和数字