首页
/
每日頭條
/
科技
/
二叉樹常考算法
二叉樹常考算法
更新时间:2025-02-10 13:47:29

二叉樹常考算法?古印度有個叫錫塔的大臣,他聰明過人,發明了一種棋子,國王百玩不厭,于是決定重賞錫塔錫塔說:“陛下,我隻要一點麥子請您讓人将麥子放在我發明的棋盤的六十四個格子内,第一格放一粒,第二格放二粒,第三格放四粒,第四格放八粒,第五格放十六粒……照這樣放下去,每格比前一格多放一倍麥粒,直到把六十四個棋格放滿就行了”國王聽了哈哈大笑,他覺得谷倉裡的麥子多着呢,填完六十四個棋格實在是小意思哪知,管糧食的大臣計算了一下,急得滿頭大汗,因為需要的麥子太多了,我來為大家科普一下關于二叉樹常考算法?以下内容希望對你有幫助!

二叉樹常考算法(趣味數學與編程)1

二叉樹常考算法

1 印度國王賜麥

古印度有個叫錫塔的大臣,他聰明過人,發明了一種棋子,國王百玩不厭,于是決定重賞錫塔。錫塔說:“陛下,我隻要一點麥子。請您讓人将麥子放在我發明的棋盤的六十四個格子内,第一格放一粒,第二格放二粒,第三格放四粒,第四格放八粒,第五格放十六粒……照這樣放下去,每格比前一格多放一倍麥粒,直到把六十四個棋格放滿就行了。”國王聽了哈哈大笑,他覺得谷倉裡的麥子多着呢,填完六十四個棋格實在是小意思。哪知,管糧食的大臣計算了一下,急得滿頭大汗,因為需要的麥子太多了。

事實上依格子順序放的麥粒數是一個等比數列:

1 2 4 8 16 32 …… 2^63。

下面來推導等比數列前n項和S的公式。設第一項為a,公比為q,則等比數列可表示為:

如果按1立方米的麥子有1500萬粒計算,國王應賞賜的麥子就約有12000億立方米,就算把全世界2000年所産生的麥子全加在一起,也沒有這個數目大呀!國王這才明白過來,這可怎麼辦呀?一個聰明的大臣對國王說:“陛下,就請錫塔自己去數麥子吧。”因為一秒鐘能數兩粒,一分鐘能數120粒,一小時也隻能數出7200粒,每天數上10小時,也隻能拿到72000粒麥子。照這樣的速度數上一年,也隻有2000萬粒——3000萬粒,也就是1—2立方米的麥子。而要想把國王如數上次給他的麥子全部數清,就得要2000億年呢!聰明的錫塔無法數完麥子隻能放棄了賞賜。

2 電腦的位數與支持的内存

先從世界人口說起。據統計,現在世界人口約75億,如果說給每人一個不重複的編号(隻使用0和1兩個符号),需要多少位數?

2^x = 7500000000

也就是求以2為底7500000000的log。

2^32 = 4294967296

2^33 = 8589934592

33個二進制位就夠了。

32位電腦有32條地址線,支持的内存是2的32次方,也就是4GB内存(1GB = 1024^3)。4GB也就是40多億個Byte。

而64位電腦理論上的尋址空間為2的64次方,達18446744073709551616,也就是17179869184G。

64位的CPU需要64位的操作系統支持。當然64位的系統也支持32位的CPU。

如果主闆有四條内存插槽為,單條内存最大的是16GB,四個内存插槽剛好可以插16x4=64GB内存。

如大部分X99/X399主闆都支持8内存插槽,用單條16G的,就是128GB内存了。

3 兩次遞歸調用,就是二叉樹的遍曆問題

如漢諾塔問題:

void han(int n,char a,char b,char c) { if(n==1) printf("%d %c→%c *\n",n,a,c); else { han(n-1,a,c,b); printf("%d %c→%c\n",n,a,c); han(n-1,b,a,c); } }

可圖示如下:

兩叉樹的擴充就是一個翻倍的問題,1,2,4,8,……,2^n

移動的最少次數應等于2^n - 1

4 貪财的富翁

一個百萬富翁遇到一個陌生人,陌生人找他談一個換錢的計劃,該計劃如下:

第一天給我你十萬元,而你第一天隻需給我一分錢,

第二天我仍給你十萬元,你給我兩分錢,

第三天我仍給你十萬元,你給我四分錢,....,

你每天給我的錢是前一天的兩倍,直到滿一個月(30天)。

百萬富翁很高興,欣然接受了這個契約。請編程序,通過計算說明,這個換錢計劃對百萬富翁是否是個劃算的交易。

#include <stdio.h> int main( ) { double m2f=1.0e5,f2m=0.01,m2fs=0,f2ms=0; int day=1;//一定要賦初值 for(day=1; day<=30; day ) { m2fs =m2f; f2ms =f2m; f2m*=2; //下面的輸出不是必需,但可以使我們更加清楚地知道解題的過程,這可以是一個技巧 printf("第%d天,陌生人給富翁累計%.2f,富翁給陌生人累計%.2f,差額:%.2f\n", day, m2fs, f2ms, m2fs-f2ms); } printf("最終,陌生人給富翁:%.2f,富翁給陌生人:%.2f。 ", m2fs, f2ms); if(m2fs>f2ms) printf("陌生人自找"); else { if (m2fs<f2ms) printf("富翁傻帽了"); else printf("兩人持平,沒意思的交易"); } printf("\n"); while(1); return 0; }

輸出:

第1天,陌生人給富翁累計100000.00,富翁給陌生人累計0.01,差額:99999.99

第2天,陌生人給富翁累計200000.00,富翁給陌生人累計0.03,差額:199999.97

第3天,陌生人給富翁累計300000.00,富翁給陌生人累計0.07,差額:299999.93

第4天,陌生人給富翁累計400000.00,富翁給陌生人累計0.15,差額:399999.85

第5天,陌生人給富翁累計500000.00,富翁給陌生人累計0.31,差額:499999.69

第6天,陌生人給富翁累計600000.00,富翁給陌生人累計0.63,差額:599999.37

第7天,陌生人給富翁累計700000.00,富翁給陌生人累計1.27,差額:699998.73

第8天,陌生人給富翁累計800000.00,富翁給陌生人累計2.55,差額:799997.45

第9天,陌生人給富翁累計900000.00,富翁給陌生人累計5.11,差額:899994.89

第10天,陌生人給富翁累計1000000.00,富翁給陌生人累計10.23,差額:999989.77

第11天,陌生人給富翁累計1100000.00,富翁給陌生人累計20.47,差額:1099979.53

第12天,陌生人給富翁累計1200000.00,富翁給陌生人累計40.95,差額:1199959.05

第13天,陌生人給富翁累計1300000.00,富翁給陌生人累計81.91,差額:1299918.09

第14天,陌生人給富翁累計1400000.00,富翁給陌生人累計163.83,差額:1399836.17

第15天,陌生人給富翁累計1500000.00,富翁給陌生人累計327.67,差額:1499672.33

第16天,陌生人給富翁累計1600000.00,富翁給陌生人累計655.35,差額:1599344.65

第17天,陌生人給富翁累計1700000.00,富翁給陌生人累計1310.71,差額:1698689.29

第18天,陌生人給富翁累計1800000.00,富翁給陌生人累計2621.43,差額:1797378.57

第19天,陌生人給富翁累計1900000.00,富翁給陌生人累計5242.87,差額:1894757.13

第20天,陌生人給富翁累計2000000.00,富翁給陌生人累計10485.75,差額:1989514.25

第21天,陌生人給富翁累計2100000.00,富翁給陌生人累計20971.51,差額:2079028.49

第22天,陌生人給富翁累計2200000.00,富翁給陌生人累計41943.03,差額:2158056.97

第23天,陌生人給富翁累計2300000.00,富翁給陌生人累計83886.07,差額:2216113.93

第24天,陌生人給富翁累計2400000.00,富翁給陌生人累計167772.15,差額:2232227.85

第25天,陌生人給富翁累計2500000.00,富翁給陌生人累計335544.31,差額:2164455.69

第26天,陌生人給富翁累計2600000.00,富翁給陌生人累計671088.63,差額:1928911.37

第27天,陌生人給富翁累計2700000.00,富翁給陌生人累計1342177.27,差額:1357822.73

第28天,陌生人給富翁累計2800000.00,富翁給陌生人累計2684354.55,差額:115645.45

第29天,陌生人給富翁累計2900000.00,富翁給陌生人累計5368709.11,差額:-2468709.11

第30天,陌生人給富翁累計3000000.00,富翁給陌生人累計10737418.23,差額:-7737418.23

最終,陌生人給富翁:3000000.00,富翁給陌生人:10737418.23。 富翁傻帽了

2^30 = 1073741824,也就是上面說的1G,10億 。

-End-

Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
電腦怎麼永久清除微信數據
電腦怎麼永久清除微信數據
演示機型:華為MateBookX系統版本:win1020H2APP版本:電腦版微信3.2.11、打開并登錄自己的電腦版微信客戶端,登錄成功後顯示聊天頁面,點擊左下角的三條橫線菜單按鈕。2、彈出菜單内容,選擇其中的設置選項。3、彈出設置窗口,默認是自己的頭像和昵稱信息,點擊左側的通用設置選項。4、在通用設置中,看到最下方有個清空聊天記錄的按鈕,點擊它。5、彈出提示框,點擊确認,等一會即可删除完畢。微
2025-02-10
白掌怎麼修剪
白掌怎麼修剪
1、葉片。實際上白掌在生長過程中葉片和株型是能自我調控的,我們的修剪主要是針對葉片出現的老化、變黃、變黑,這種情況下我們對葉面進行修剪,修剪時候從基部開始,不要留下過長的葉柄,不然之後會出現脫落或者傳染病害。2、花。花的修剪主要是開完花之後殘花的修剪,同樣也是從花朵的基部開始。花開敗之後會結果實,當...
2025-02-10
水果電池原理
水果電池原理
1、水果電池的發電原理是:兩種金屬片的電化學活性是不一樣的,其中更活潑的那邊的金屬片能置換出水果中的...
2025-02-10
華為手表如何關機
華為手表如何關機
演示機型:huaweiwatchfit系統版本:AndroidWear手表在開機狀态下,長按上鍵5秒鐘,出現重啟/關機選項畫面,點擊關機即可。華為智能手表是華為推出的首款智能手表産品,該設備完全兼容安卓和蘋果的IOS系統。華為智能手表将支持蘋果iOS8.2及其以上系統和Android4.3及其以上版本的手機配對。産品簡介:在機身内部裝備了時鐘頻率為1.2GHz的高通APQ8026處理器,512MB
2025-02-10
羊圈怎麼去除潮濕
羊圈怎麼去除潮濕
1、通風透氣。最簡單的自然是通風透氣了,這個隻要讓羊圈的空氣流通起來,水汽自然就會排出去了,那麼羊圈就會幹燥很多。不過這樣做也要看情況來的,主要是看外界的濕潤程度,如果外面是剛下完雨這樣的情況,那麼最好還是把羊圈密封下,以免水汽倒流到羊圈,加重潮濕程度。通風的時候不定時的可以看看羊圈的效果,如果濕氣明顯沒有減少,那麼最好采取其它措施,不要就浪費時間。2、除濕器。這個方法就是投資比較大一點,但是效果
2025-02-10
Copyright 2023-2025 - www.tftnews.com All Rights Reserved