?? 02.txt
字號:
假定魚的總數為X,則X可以按照題目的要求進行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則X就是題目的解。
*程序說明與注釋
#include<stdio.h>
int main()
{
int n,i,x,flag=1; /*flag:控制標記*/
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; /*若不能分配則置標記falg=0退出分配過程*/
if(flag) break; /*若分配過程正常結束則找到結果退出試探的過程*/
else flag=1; /*否則繼續試探下一個數*/
}
printf("Total number of fish catched=%d\n",n); /*輸出結果*/
}
*運行結果
Total number of fish catched = 3121
*問題的進一步討論
程序采用試探法,試探的初值為6,每次試探的步長為1。這是過分保守的做法。可以在進一步分析題目的基礎上修改此值,增大試探的步長值,以減少試探次數。
*思考題
請使用其它的方法求解本題。
16.出售金魚
買賣提將養的一缸金魚分五次出售系統上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?
*問題分析與算法設計
題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+1)分之一再加1/(j+1)條。第五次將第四次余下的11條全賣了。
假定第j次魚的總數為X,則第j次留下:
x-(x+1)/(j+1)
當第四次出售完畢時,應該剩下11條。若X滿足上述要求,則X就是題目的解。
應當注意的是:"(x+1)/(j+1)"應滿足整除條件。試探X的初值可以從23開始,試探的步長為2,因為X的值一定為奇數。
*程序說明與注釋
#include<stdio.h>
int main()
{
int i,j,n=0,x; /*n為標志變量*/
for(i=23;n==0;i+=2) /*控制試探的步長和過程*/
{
for(j=1,x=i;j<=4&&x>=11;j++) /*完成出售四次的操作*/
if((x+1)%(j+1)==0) /*若滿足整除條件則進行實際的出售操作*/
x-=(x+1)/(j+1);
else {x=0;break;} /*否則停止計算過程*/
if(j==5&&x==11) /*若第四次余下11條則滿足題意*/
{
printf("There are %d fishes at first.\n",i); /*輸出結果*/
n=1; /*控制退出試探過程*/
}
}
}
*運行結果
There are 59 fishes at first.
*思考題
日本著名數學游戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完后父親說:“老大將分給你的桔子的1/8給老二;老二拿到后連同原先的桔子分1/7給老三;老三拿到后連同原先的桔子分1/6給老四;老四拿到后連同原先的桔子分1/5給老五;老五拿到后連同原先的桔子分1/4給老六;老六拿到后連同原先的桔子分1/3給老大”。結果大家手中的桔子正好一樣多。問六兄弟原來手中各有多少桔子?
17.平分七筐魚
甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當晚返航時,他們發現有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測認為七個滿筐魚的重量是相等的,7個半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份?
*問題分析與算法設計
根據題意可以知道:每個人應分得七個籮筐,其中有3.5筐魚。采用一個3*3的數組a來表示三個人分到的東西。其中每個人對應數組a的一行,數組的第0列放分到的魚的整筐數,數組的第1列放分到的半筐數,數組的第2列放分到的空筐數。由題目可以推出:
。數組的每行或每列的元素之和都為7;
。對數組的行來說,滿筐數加半筐數=3.5;
。每個人所得的滿筐數不能超過3筐;
。每個人都必須至少有1 個半筐,且半筐數一定為奇數
對于找到的某種分魚方案,三個人誰拿哪一份都是相同的,為了避免出現重復的分配方案,可以規定:第二個人的滿筐數等于第一個人的滿筐數;第二個人的半筐數大于等于第一個人的半筐數。
*程序說明與注釋
#include<stdio.h>
int a[3][3],count;
int main()
{
int i,j,k,m,n,flag;
printf("It exists possible distribtion plans:\n");
for(i=0;i<=3;i++) /*試探第一個人滿筐a[0][0]的值,滿筐數不能>3*/
{
a[0][0]=i;
for(j=i;j<=7-i&&j<=3;j++) /*試探第二個人滿筐a[1][0]的值,滿筐數不能>3*/
{
a[1][0]=j;
if((a[2][0]=7-j-a[0][0])>3)continue; /*第三個人滿筐數不能>3*/
if(a[2][0]<a[1][0])break; /*要求后一個人分的滿筐數>=前一個人,以排除重復情況*/
for(k=1;k<=5;k+=2) /*試探半筐a[0][1]的值,半筐數為奇數*/
{
a[0][1]=k;
for(m=1;m<7-k;m+=2) /*試探 半筐a[1][1]的值,半筐數為奇數*/
{
a[1][1]=m;
a[2][1]=7-k-m;
for(flag=1,n=0;flag&&n<3;n++)
/*判斷每個人分到的魚是 3.5筐,flag為滿足題意的標記變量*/
if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7)
a[n][2]=7-a[n][0]-a[n][1]; /*計算應得到的空筐數量*/
else flag=0; /*不符合題意則置標記為0*/
if(flag)
{
printf("No.%d Full basket Semi–basket Empty\n",++count);
for(n=0;n<3;n++)
printf(" fisher %c: %d %d %d\n",
'A'+n,a[n][0],a[n][1],a[n][2]);
}
}
}
}
}
}
* 運行結果
It exists possible distribution plans:
No.1 Full basket Semi–basket Empty
fisher A: 1 5 1
fisher B: 3 1 3
fisher C: 3 1 3
No.2 Full basket Semi–basket Empty
fisher A: 2 3 2
fisher B: 2 3 2
fisher C: 3 1 3
*思考題
晏會上數學家出了一道難題:假定桌子上有三瓶啤酒,癬瓶子中的酒分給幾個人喝,但喝各瓶酒的人數是不一樣的。不過其中有一個人喝了每一瓶中的酒,且加起來剛好是一瓶,請問喝這三瓶酒的各有多少人?
(答案:喝三瓶酒的人數分別是2人、3人和6人)
18.有限5位數
個位數為6且能被3整除的五位數共有多少?
*題目分析與算法設計
根據題意可知,滿足條件的五位數的選擇范圍是10006、10016。。。99996。可設基礎數i=1000,通過計算i*10+6即可得到欲選的數(i的變化范圍是1000~999),再判斷該數能否被3整除。
*程序說明與注釋
#include<stdio.h>
int main()
{
long int i;
int count=0; /*count:統計滿足條件的五位數的個數*/
for(i=1000;i<9999;i++)
if(!((i*10+6)%3)) /*判斷所選的數能否被3整除*/
count++; /*若滿足條件則計數*/
printf("count=%d\n",count);
}
*運行結果
count=2999
*思考題
求100到1000之間有多少個其數字之和為5的整數。
(答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500)
19.8除不盡的自然數
一個自然數被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到一個商為a。又知這個自然數被17除余4,所得的商被17除余15,最后得到一個商是a的2倍。求這個自然數。
*問題分析與算法設計
根據題意,可設最后的商為i(i從0開始取值),用逆推法可以列出關系式:
(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4
再用試探法求出商i的值。
*程序說明與注釋
#include<stdio.h>
int main()
{
int i;
for(i=0;;i++) /*試探商的值*/
if(((i*8+7)*8+1)*8+1==(34*i+15)*17+4)
{ /*逆推判斷所取得的當前i值是否滿足關系式*/
/*若滿足則輸出結果*/
printf("The required number is: %d\n",(34*i+15)*17+4);
break; /*退出循環*/
}
}
*運行結果
The required number is:1993
20.一個奇異的三位數
一個自然數的七進制表達式是一個三位數,而這個自然數的九進制表示也是一個三位數,且這兩個三位數的數碼正好相反,求這個三位數。
*問題分析與算法設計
根據題意可知,七進制和九進制表示的這全自然數的每一位一定小于7,可設其七進制數形式為kji(i、j、k的取值分別為1~6),然后設其九進制表示形式為ijk。
*程序說明與注釋
#include<stdio.h>
int main()
{
int i,j,k;
for(i=1;i<7;i++)
for(j=0;j<7;j++)
for(k=1;k<7;k++)
if(i*9*9+j*9+k==i+j*7+k*7*7)
{
printf("The special number with 3 digits is:");
printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,i*9*9+j*9+k);
}
}
*運行結果
The special number with 3 digits is:503(7)=305(9)=248(10)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -