2013年7月17日 星期三

[UVA]The 3n + 1 Problem

CPE 10400、UVA 100程式解題。







































解題觀念:


最近都在解判斷奇偶數的題目,這題也是。

奇數就進行乘3加1的計算,如果是偶數就直接除以2

計算到最後終將會變成1,因此1為中止計算的條件!

題目所說的考拉茲長度,其實就是要你算出"總共要計算幾次才會變成1"。

輸出最長的長度,也就是計算最多次的那個次數。

抓住以上這幾點,解這題就簡單啦~


解題步驟:

宣告a、b兩個變數設定計算範圍。
**這裡要注意一點,題目沒有說a一定大於b,所以要記得處理a>b時的情況喔!!

如果a>b,則另設一變數c。c =a,之後a=b,再將b=c,將a、b值互換。
(ex:a=10;b=1。c=a-->c=10,a=b-->a=1,b=c-->b=10。變成a=1,b=10)

為什麼要另外設定aa和bb來存放a和b的值呢??  詳解請看下面EX。

利用for迴圈去跑每一個值的計算過程

宣告n變數存放a值做計算(因為i=a,所以i值不能變動),宣告count計算次數

while迴圈做重複計算,當n=1時停止!!

因為只要印出最長的那個次數,所以要用if判斷式去判斷最大值,之後再印出。


EX:

1 10。從1開始逐一進行計算(1~10),其計算次數最多發生在值為9時,因此這裡直接取9做計算。

9=>設定給n,進入while迴圈 => 進入判斷式,為奇數,做*3+1的計算 => 28為偶數,除以2 => 14 =>...(中略)...=> 4 => 2 => 1。

共19次,count共加19次=>count1+19=20。印出。

**如果輸入 10 1。則a>b,會進行a,b值互調,會變成a=1,=10。

但這樣在輸出時會造成輸出格式錯誤!!
原本應該印出 10 1 20,會變成 1 10 20,而造成WA。

這就是為什麼還要再另設aa和bb來存放原本的a、b值,印出的時候印出原本的a和b,這樣才會符合題意。


BY 小K

沒有留言:

張貼留言