演算法 演算法中的趣味數學(一)

2021-09-06 10:41:52 字數 3084 閱讀 1505

小續

以下是我收集的一些有趣的計算例項,希望能夠提高讀者的程式設計水平及分析問題/解決問題的能力

馬克思手稿中的數學題

馬克思手稿中有一道趣味數學題:有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條時,才找到所求的答案。這個算...