問題描述
某核反應堆有兩類事件發生:
(1)高能質點碰擊核子時,質點被吸收,放出3個高能質點和1個低能質點;
(2)低能質點碰擊核子時,質點被吸收,放出2個高能質點和1個低能質點。
假定開始的時候(0微秒)只有一個高能質點射入核反應堆,每一微秒引起一個事件發生(對於一個事件,當前存在的所有質點都會撞擊核子),試確定n微秒時高能質點和低能質點的數目。。
設計細節
核反應堆問題可以看作最基本的迭代法求解的問題,所以幾年前,有個GG很神氣地對我說:“這課題我半小時就做完了!”其實他只寫了一個main()和不到20行代碼,輸入輸出只有一句話。
如果是一道程序題,他當然算做完了,但是課程設計與編程練習最大的區別,就是課程設計一定要發揚俄羅斯戰列艦的精神,用各種武器堆滿甲板——正式地說,就是要充分覆蓋C語言課程的所有章節,把所有學過的都用一遍,然後再來講講一二三四五,用了什麼,怎麼用的,效率、可讀好不好。
在這個問題裏,一定要想到程序是“一直”運行的,所以,迭代的效率一定是不理想的,要用數組把已經計算出來的結果存起來,叫以空間換時間也行,叫打表法也行,叫動態規劃法也行。
兩個細節:第一,因爲存在高能質點和低能質點,所以兩個一維數組就不如一個結構體數組;第二,質點個數的類型爲long,數組的最大長度爲17,也就是16秒以後的結果是算不出來的,這裏要討論爲什麼。
然後,就帶來一個延伸的問題:如果一定要16秒以後的數據,怎麼辦?到了這一步可以發現,在看似簡單的核反應堆問題裏,其實隱藏了一個大數相加問題。
參考設計
這裏沒有考慮大數相加問題,只是解決了動態規劃,並且儘量地覆蓋了一下C語言的各個章節,還是那句老話,自己寫得出來就不要下了。點擊打開鏈接