日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五人分鱼

發(fā)布時(shí)間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五人分鱼 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

五人分魚問題

問題描述:

A、B、C、D、E這5個(gè)人合伙夜間捕魚,凌晨時(shí)都已經(jīng)疲憊不堪,于是各自在河邊的樹叢中找地方睡著了。第二天日上三竿時(shí),A第一個(gè)醒來,他將魚平分為5份,把多余的一條扔回河中,然后拿著自己的一份回家去了;B第二個(gè)醒來,但不知道A已經(jīng)拿走了一份魚,于是他將剩下的魚平分為5份,扔掉多余的一條,然后只拿走了自己的一份;接著C、D、E依次醒來,也都按同樣的辦法分魚。問這5人至少合伙捕到多少條魚?每個(gè)人醒來后所看到的魚是多少條?

#include "stdio.h"int main() {int i=0; //假定最后一人拿到的魚double num[5],p[5];//num拿走前剩下的數(shù)量,p拿走的魚int camp;while(1){p[0]=i++;//窮舉最后一人拿走的魚num[0]=p[0]*5+1;int j;for(j=1;j<5;j++){p[j]=num[j-1]/4;//整型會(huì)自動(dòng)去尾真煩。所以定義了double類型camp=p[j]; //目前我想出來的判斷是否為整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;//如果魚不為整數(shù)或剩下的魚變多了,跳出}}if(j==5) {break;}}int j;for(j=0;j<5;j++){printf("還有%d條魚;p[%d]拿走%d條。\n",(int)num[j],j,(int)p[j]);} }

運(yùn)行結(jié)果:
還有1276條魚;p[0]拿走255條。
還有1596條魚;p[1]拿走319條。
還有1996條魚;p[2]拿走399條。
還有2496條魚;p[3]拿走499條。
還有3121條魚;p[4]拿走624條。


解題思路:

每個(gè)人的操作都是在現(xiàn)有的魚數(shù)量上 扔掉一條,再均分為五份,取走一份。
得到關(guān)系式:
num[j]=p[j]*5+1 //醒來前的魚數(shù)量為拿走的5倍加1
p[0]必然存在最小整數(shù)解。
所以運(yùn)用累加窮舉出p[0],再判斷其它人是否符合實(shí)記情況。(魚取整數(shù)條)

在這遇到幾個(gè)問題

  • 求前一個(gè)人拿走魚的數(shù)量時(shí) “p[j]=num[j-1]/4”
    原本定義int類型,程序自動(dòng)去尾,不能判斷魚是否為整數(shù)。
  • 判斷剩下的魚變多完全是多余的。

所以將 p[] ; num[] 都定義為了double類型;引入了一個(gè)臨時(shí)比較用的int型 camp 。


其它大神的解法

#include<stdio.h> /分魚遞歸函數(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ù)雜了,的確也能很好的解決問題。


#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

代碼簡潔,真正的大神啊!
直接使用剩下的魚的數(shù)量運(yùn)算,每次遞增5完全避免了出現(xiàn)小數(shù)的情況。
只是 i=16 我沒想明白是怎么來的。我只能理解從6開始。

總結(jié)

以上是生活随笔為你收集整理的五人分鱼的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。