小續
以下是我收集的一些有趣的計算例項,希望能夠提高讀者的程式設計水平及分析問題/解決問題的能力
馬克思手稿中的數學題
馬克思手稿中有一道趣味數學題:有30個人,其中有男人、女人和小孩,在一家飯館吃飯共花了50先令。若每個男人花3先令,每個女人花2先令,每個小孩花1先令。問男人、女人和小孩各有幾人?
例項解析:
設x,y,z分別代表男人、女人和小孩的人數。按題目要求,可得到下面方程:
x + y + z = 30 (1)
3x + 2y + z = 50 (2)
(2)-(1)可得
2x + y = 20 (3)
由(3)式可知,x的變化範圍是1~10 (根據題意,男人、女人、小孩都有,故x、y、z都不能為0)。
程式如下:
#include int main()
printf("--------------------------------\n");
printf(" press any key to quit...");
getch();
return 0;
}
配對新郎和新娘
3對情侶參加婚禮,3個新郎為a、b、c,3個新娘為x、y、z。有人不知道誰和誰結婚,於是詢問了6位新人中的3位,但聽到的回答是這樣的:a說他將和x結婚;x說她的未婚夫是c;c說他將和z結婚。這人聽後知道他們在開玩笑,全是假話。請程式設計確認誰和誰是一對。
例項解析:
分表將a、b、c用1,2,3表示,將x和a結婚表示為「x == 1」,將y不與a結婚表示為「y !=1」,按題目敘述可寫出下列表示式:
x != 1 a不與x結婚
x != 3 x的未婚夫不是c
z != 3 c不與z結婚
窮舉滿足以上條件所有可能的情況。
程式如下:
#include int main()
printf("--------------------------------------\n");
printf(" press any key to quit...");
getch();
return 0;
}
分糖果
10個小孩圍成一圈分糖果,老師分給第乙個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊。然後所有的小孩同時將手中的糖分一半給右邊的小孩,糖塊為奇數的可向老師再要一塊。問這樣的操作經過幾次,大家手中的糖一樣多?每人有多少塊糖?
例項解析:
分糖過程是乙個機械的重複過程。演算法完全可以按照描述的過程進行模擬。
程式如下:
#include void print(int s);
int judge(int c);
int j = 0;
int main()
; int i, t[10], k;
printf("child no. 1 2 3 4 5 6 7 8 9 10\n");
printf("-------------------------------------\n");
printf("round no.|\n");
print(sweet); //輸出每個人手中糖的塊數
while(judge(sweet))
sweet[0] += t[9];
if(sweet[0]%2!=0)
sweet[0]++;
print(sweet); //輸出當前每個孩子中手中的糖數
}printf("-------------------------------------\n");
printf("\n press any key to quit...");
getch();
return 0;
}int judge(int c)
void print(int s) //輸出陣列中每個元素的值
波瓦松的分酒問題
法國著名數學家波瓦松(poison)在青年時代研究過乙個有趣的數學問題:某人有12品脫的啤酒一瓶,想從中倒出6品脫,但他沒有6品脫的容器,僅有乙個8品脫和5品脫的容器,怎樣才能將啤酒分成兩個6品脫呢?
例項解析:
將12品脫酒用8品脫和5品脫的空瓶平分,可以抽象為解不定方程:
8x - 5y = 6
其意義是:從12品脫的瓶中向8品脫的瓶中倒x次,並且將5品脫瓶中的酒向12品脫的瓶中倒y次,最後在12品脫的瓶中剩餘6品脫的酒。
分別用a,b,c代表12品脫、8品脫和5品脫的瓶子,求出不定方程的整數解,按照不定方程的意義則倒酒法為:
a→b→c→a
x y
倒酒的規則如下:
(1)按a→b→c→a的順序;
(2) b倒空後才能從a中取;
(3) c裝滿後才能向a中倒。
程式如下:
#include void getti(int a, int y, int z);
int i; //最後需要分出的重量
int main()
void getti(int a, int y, int z)
//a:第一瓶的容量 y:第二個瓶的容量 z:第三個瓶的容量
else if(c == z)
else if(b > z-c)
else
printf(" <%d> | %4d %4d %4d\n",j++,a,b,c);
}printf("-----------------------------\n");
}
本文出自 「成鵬致遠」 部落格,請務必保留此出處 演算法 演算法中的趣味數學(一)
小續 以下是我收集的一些有趣的計算例項,希望能夠提高讀者的程式設計水平及分析問題 解決問題的能力 馬克思手稿中的數學題 馬克思手稿中有一道趣味數學題 有30個人,其中有男人 女人和小孩,在一家飯館吃飯共花了50先令。若每個男人花3先令,每個女人花2先令,每個小孩花1先令。問男人 女人和小孩各有幾人?...
趣味演算法(一)
有一些陣列如 int 這樣的乙個陣列,這個陣列的第乙個必須從0開始,以次 1列出,該陣列內最後乙個數是這個陣列的長度,因此 int,missed number為0 int,missed number為3 int,missed number為1 public class missednumber el...
趣味數學 雞兔同籠演算法
其實很多人小時候都算過這樣類似的題目 雞兔同籠,頭15只,腳40只,問雞和兔子各多少只?小學的時候,有小朋友會這樣算,1個數1個數的湊,假設雞有1只,那麼兔就有14只,腿共有58條 雞有2只,那麼兔就有13只,腿共有56條 依次類推,直到雞有10只,兔有5只,腿共有40條時,才找到所求的答案。這個算...