[題解] UVa 465 - Overflow
Tags
- 題解
- UVa
- E難度
略譯
每組輸入一行,給你一個非負整數、+或*、再給你另一個非負整數。
需要判斷第一個數、第二個數、運算結果是否超過signed int範圍
即 [-2147483648, 2147483647]
題解
這題依題意便知給的數字可能十分大,因此需以字串方式讀入和協助判斷。
一個較簡單的方法是,讀入後將字串切成三段:第一個數、第二個數、運算符號,
分別判斷大小後,來決定是否需要將數字讀出來計算。
注意數字可能有開頭0,直接用長度(即位數)判斷會錯,必須先去掉開頭的0。
往下找到第一個不是0的數,把前面的0忽略掉後,再用長度判斷。
長度剛好是10的話,用sscanf從字串中讀出數字判斷。
我們要判斷它是不是超出int範圍,表示它還是可能太大,用long long 存。
運算若是加法,兩個數其中一個過大,結果就必定過大。
若是乘法,兩個數其中一個過大,另一個數不是0,結果就必定過大。
除了上述狀況,再以sscanf從字串中讀出數字計算結果看看。
由於結果數字可能很大,以long long儲存並計算較為保險。
實作提示
- 長度可幫助判斷,但需要去除開頭0
- int無法分辨一個數是否超出int範圍的,使用long long讀入或計算
- sscanf是這題的好幫手
- 注意乘以0的情況
cmusu