讀入兩個整數與一個運算符(+、-、*、/、%),輸出運算結果。除法為整數除法,取模為整數取模。運算符非法輸出 "ERROR"。
#include <stdio.h>
int main() {
int m, n;
char op;
scanf("%d %c %d", &m, &op, &n); // 格式化讀取,自動跳過空白
printf("m = %d\nop : %c\nn = %d\n", m, op, n); // 題目要求回顯輸入
switch (op) {
case '+': printf("%d\n", m + n); break;
case '-': printf("%d\n", m - n); break;
case '*': printf("%d\n", m * n); break;
case '/': printf("%d\n", m / n); break; // 整數除法,截斷向零
case '%': printf("%d\n", m % n); break; // 取模,符號同被除數
default: printf("ERROR\n");
}
return 0;
}
| 項目 | 說明 | 注意事項 |
|---|---|---|
| 輸入格式 | %d %c %d | 中間空格自動跳過換行/空格,%c 讀取運算符 |
| 除法行為 | C99 規定向零截斷 | -5/2 = -2,-5%2 = -1 |
| 除零保護 | 題目未要求 | 實際項目必須檢查 n!=0 |
| 溢出風險 | int 範圍 ±21億 | 乘法可能溢出,實際用 long long |
| 輸出格式 | 嚴格匹配樣例 | 回顯輸入含換行,結果獨立行 |
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef enum { OK, ERR_DIV_ZERO, ERR_OVERFLOW, ERR_INVALID_OP } CalcStatus;
CalcStatus calculate(int a, int b, char op, long long *result) {
switch (op) {
case '+':
if ((b > 0 && a > LLONG_MAX - b) || (b < 0 && a < LLONG_MIN - b))
return ERR_OVERFLOW;
*result = (long long)a + b;
break;
case '-':
if ((b < 0 && a > LLONG_MAX + b) || (b > 0 && a < LLONG_MIN + b))
return ERR_OVERFLOW;
*result = (long long)a - b;
break;
case '*':
if (a != 0 && llabs(b) > LLONG_MAX / llabs(a)) return ERR_OVERFLOW;
*result = (long long)a * b;
break;
case '/':
if (b == 0) return ERR_DIV_ZERO;
*result = a / b;
break;
case '%':
if (b == 0) return ERR_DIV_ZERO;
*result = a % b;
break;
default:
return ERR_INVALID_OP;
}
return OK;
}
int main() {
int m, n; char op;
if (scanf("%d %c %d", &m, &op, &n) != 3) return 1;
printf("m = %d\nop : %c\nn = %d\n", m, op, n);
long long result;
switch (calculate(m, n, op, &result)) {
case OK: printf("%lld\n", result); break;
case ERR_DIV_ZERO: printf("ERROR: Division by zero\n"); break;
case ERR_OVERFLOW: printf("ERROR: Integer overflow\n"); break;
default: printf("ERROR\n");
}
return 0;
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 10 + 3 | m = 10 op : + n = 3 13 | 加法 |
| 10 - 3 | ... | 7 |
| 10 * 3 | ... | 30 |
| 10 / 3 | ... | 3 (整數除法) |
| 10 % 3 | ... | 1 |
| 10 ^ 3 | ... | ERROR |
| -5 / 2 | ... | -2 (C99 向零截斷) |
| -5 % 2 | ... | -1 (符號同被除數) |
本題考察 scanf 格式化輸入、switch 多分支、整數運算語義。工程化時需關注除零保護、溢出檢測、錯誤碼設計、類型擴展。掌握 long long 配合 LLONG_MAX 的溢出判斷模式,是編寫健壯數值計算代碼的基本功。