跳到內容

05|簡易計算機

還沒完成C 或 C++ 皆可CPU 時間上限 1 秒

相關主題: C 基礎速查、資料型態與範圍

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。

輸入:

7
3 + 5
10 - 25
-4 * 6
7 / 2
-7 / 2
-7 % 3
9 / 0

輸出:

8
-15
-24
3
-3
-1
error
  • switch 搭配 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。)