一、題目重述 這題真的需要好好講一下,因為題目敘述真的好長。 我重新敘述一下題目好了: 輸入: 兩個羅馬數字 輸出: 一個羅馬數字,值為輸入的兩值相減 二、解法大綱 首先,羅馬數字只是用來單純標示他的值,無法做計算 而且電腦只看得懂阿拉伯數字,所以在做計算時,須先把羅馬轉成阿拉伯 因為題目是輸入兩個羅馬數字,無法直接做相減的動作,所以第一步先把羅馬轉成阿拉伯。 轉成阿拉伯後,就可以相減了,記得加絕對值,因為題目說可能第一數比較小。 計算出答案後,最後把它變成羅馬數字,就可以了。 三、解法問題 有兩個問題,也就是題目的主要部分。 1.羅馬轉成阿拉伯 我們先來觀察一個羅馬數字: III 我想聰明的你,這一定是三,那我問: 你怎麼知道? 我先給一下轉換表: I 1 V5 X10 L50 C100 D500 M1000 好,回來正題,III可以看成是 I + I + I 轉換後也就是 1 + 1 + 1,答案是3 再一個羅馬數字 IV 如果你用上面的方法,1 + 5 = 6,可是答案是四耶~ 那是因為羅馬數字有一個特殊的規則, 數碼限制: 同一數碼最多只能連續出現三次,如40不可表示為XXXX,而要表示為XL (羅馬數字 - 維基百科) 如果我們使用IIII來表示4,感覺I太多了,所以用IV來表示,意思是 5 - 1 換一個方式來表達,也就是 -1 + 4 那 MCDXXXVII 呢?我們先把一個一個分開來,變成: M, C, D, X, X, X, V, I, I 接下來,一一轉成數字,變成: 1000, 100, 500, 10, 10, 10, 5, 1, 1 接著,我們使用一個小伎倆: 在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字 我們先找右邊數字比自己大的,找到就把它變成負的 1000, 100, 500, 10, 10, 5, 1, 1 1000右邊是100,比1000小,不變成負的,下一個 100右邊是500,比100大,把它變成負的(100 => -100) 500右邊是10,...
作者已經移除這則留言。
回覆刪除不好意思請教一下前面的try跟except 區塊是什麼?
回覆刪除因為沒有給測試資料的數量
刪除也就是不知道要執行input()多少次
這時候就必然執行的while迴圈一直讀資料
如果資料讀完了還執行input()
程式就會拋出exception (raise exception)
try:
//do something
except some_exception:
會接住try區塊拋出的, 類型為"some_exception" 的 exception
也就是說
在try區塊內的input()讀不到資料拋出拋出exception後
會被面的except接住
進而執行break跳出while迴圈
就降
另外
如果沒有指定要接住哪類型的exception
最好不要寫
except:
而是
except Exception:
如果只寫except而沒有指明要接住哪一種exception的話
會連KeyboardInterrupt都接住
進而使你無法以ctrl+c終止程式的執行
所以如果你在自己的電腦執行他寫的程式的話
會出現無法終止程式的小問題