核反應堆問題


問題描述
    某核反應堆有兩類事件發生:
    (1)高能質點碰擊核子時,質點被吸收,放出3個高能質點和1個低能質點;
    (2)低能質點碰擊核子時,質點被吸收,放出2個高能質點和1個低能質點。
    假定開始的時候(0微秒)只有一個高能質點射入核反應堆,每一微秒引起一個事件發生(對於一個事件,當前存在的所有質點都會撞擊核子),試確定n微秒時高能質點和低能質點的數目。。


設計細節
    核反應堆問題可以看作最基本的迭代法求解的問題,所以幾年前,有個GG很神氣地對我說:“這課題我半小時就做完了!”其實他只寫了一個main()和不到20行代碼,輸入輸出只有一句話。
    如果是一道程序題,他當然算做完了,但是課程設計與編程練習最大的區別,就是課程設計一定要發揚俄羅斯戰列艦的精神,用各種武器堆滿甲板——正式地說,就是要充分覆蓋C語言課程的所有章節,把所有學過的都用一遍,然後再來講講一二三四五,用了什麼,怎麼用的,效率、可讀好不好。

    在這個問題裏,一定要想到程序是“一直”運行的,所以,迭代的效率一定是不理想的,要用數組把已經計算出來的結果存起來,叫以空間換時間也行,叫打表法也行,叫動態規劃法也行。
    兩個細節:第一,因爲存在高能質點和低能質點,所以兩個一維數組就不如一個結構體數組;第二,質點個數的類型爲long,數組的最大長度爲17,也就是16秒以後的結果是算不出來的,這裏要討論爲什麼。
   
    然後,就帶來一個延伸的問題:如果一定要16秒以後的數據,怎麼辦?到了這一步可以發現,在看似簡單的核反應堆問題裏,其實隱藏了一個大數相加問題。


參考設計
    這裏沒有考慮大數相加問題,只是解決了動態規劃,並且儘量地覆蓋了一下C語言的各個章節,還是那句老話,自己寫得出來就不要下了。點擊打開鏈接
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章