15.捕魚和分魚
A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚?
*問題分析與算法設(shè)計(jì)
根據(jù)題意,總計(jì)將所有的魚進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。
假定魚的總數(shù)為X,則X可以按照題目的要求進(jìn)行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則X就是題目的解。
*程序與程序注釋
#include
void main()
{
int n,i,x,flag=1; /*flag:控制標(biāo)記*/
for(n=6;flag;n++) /*采用試探的方法。令試探值n逐步加大*/
{
for(x=n,i=1&&flag;i<=5;i++)
if((x-1)%5==0) x=4*(x-1)/5;
else flag=0; /*若不能分配則置標(biāo)記falg=0退出分配過程*/
if(flag) break; /*若分配過程正常結(jié)束則找到結(jié)果退出試探的過程*/
else flag=1; /*否則繼續(xù)試探下一個(gè)數(shù)*/
}
printf("Total number of fish catched=%d\n",n); /*輸出結(jié)果*/
}
*運(yùn)行結(jié)果
Total number of fish catched = 3121
*問題的進(jìn)一步討論
程序采用試探法,試探的初值為6,每次試探的步長為1。這是過分保守的做法。可以在進(jìn)一步分析題目的基礎(chǔ)上修改此值,增大試探的步長值,以減少試探次數(shù)。
*思考題
請(qǐng)使用其它的方法求解本題。
A、B、C、D、E五個(gè)人在某天夜里合伙去捕魚,到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個(gè)醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個(gè)醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚?
*問題分析與算法設(shè)計(jì)
根據(jù)題意,總計(jì)將所有的魚進(jìn)行了五次平均分配,每次分配時(shí)的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。
假定魚的總數(shù)為X,則X可以按照題目的要求進(jìn)行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則X就是題目的解。
*程序與程序注釋
#include
void main()
{
int n,i,x,flag=1; /*flag:控制標(biāo)記*/
for(n=6;flag;n++) /*采用試探的方法。令試探值n逐步加大*/
{
for(x=n,i=1&&flag;i<=5;i++)
if((x-1)%5==0) x=4*(x-1)/5;
else flag=0; /*若不能分配則置標(biāo)記falg=0退出分配過程*/
if(flag) break; /*若分配過程正常結(jié)束則找到結(jié)果退出試探的過程*/
else flag=1; /*否則繼續(xù)試探下一個(gè)數(shù)*/
}
printf("Total number of fish catched=%d\n",n); /*輸出結(jié)果*/
}
*運(yùn)行結(jié)果
Total number of fish catched = 3121
*問題的進(jìn)一步討論
程序采用試探法,試探的初值為6,每次試探的步長為1。這是過分保守的做法。可以在進(jìn)一步分析題目的基礎(chǔ)上修改此值,增大試探的步長值,以減少試探次數(shù)。
*思考題
請(qǐng)使用其它的方法求解本題。