05|簡易計算機
還沒完成C 或 C++ 皆可CPU 時間上限 1 秒
C 或 C++ 皆可|CPU 時間上限 1 秒
寫一個簡單的整數計算機。每一行給你一個算式 a op b,請算出結果。運算子 op 是 +、-、*、/、% 其中之一。
除法和取餘數的規則和 C/C++ 的整數運算一樣:
/是整數除法,結果往 0 的方向捨去小數,例如7 / 2 = 3、-7 / 2 = -3%是取餘數,結果的正負號跟著 a,並且一定滿足(a / b) * b + a % b == a,例如-7 % 3 = -1、7 % -3 = 1- 如果 op 是
/或%,而且 b 是 0,就沒辦法計算,請輸出error
第一行是一個整數 T(1 ≤ T ≤ 10,000),代表有幾個算式。
接下來 T 行,每行一個算式,依序是整數 a、運算子 op、整數 b,三者之間各用一個空白隔開:
- -1,000,000,000 ≤ a ≤ 1,000,000,000
- -1,000,000,000 ≤ b ≤ 1,000,000,000
- op 是
+、-、*、/、%其中一個字元 - 負數的負號會緊貼在數字前面,例如
5 - -3
輸出 T 行,依照輸入的順序,每行是對應算式的結果(一個整數),或是 error。
輸入:
73 + 510 - 25-4 * 67 / 2-7 / 2-7 % 39 / 0輸出:
8-15-243-3-1errorswitch搭配char:case '+': ... break;。忘了寫break會繼續執行下一個 case 的程式碼- 字元用單引號
'+',字串用雙引號"+",兩者型別不同 - 整數除以 0 是未定義行為(通常程式會直接當掉),計算前一定要先檢查
- 10^9 × 10^9 = 10^18,超過
int,要用long long(最大約 9.2 × 10^18) - C:
scanf("%lld %c %lld", &a, &op, &b)。格式字串裡的空白會跳過任意數量的空白字元(包含換行) - C++:
std::cin >> a >> op >> b,>>讀char時會自動跳過前面的空白
提示 1:用 scanf 讀數字後面的字元,最容易出錯的地方
%d、%lld 這類讀數字的格式會自動跳過前面的空白,但 %c 不會,它會讀到下一個字元,不管那是不是空白。
所以 scanf("%lld%c%lld", ...) 讀 3 + 5 時,op 會讀到 3 後面的空白,而不是 +。在 %c 前面加一個空白:" %c",意思是「先跳過所有空白,再讀一個字元」。
提示 2:switch 的基本架構
switch (op) {case '+': // ... break;case '-': // ... break;// 其他運算子 ...}/ 和 % 的 case 裡,要先判斷 b 是不是 0。
提示 3:負數的除法和餘數要另外處理嗎?
不用。從 C99 和 C++11 開始,標準就規定整數除法往 0 的方向捨去,和題目要求的一樣,直接用 / 和 % 就好。
(如果你寫過 Python 會發現不一樣:Python 的 // 是往負無限大捨去,-7 // 2 是 -4,-7 % 3 是 2。)