{ }codelper
switch 语句整数除法P0021

四则计算器

一行给出 "a op b",各部分之间用一个空格分隔,op 是 +、-、*、/ 之一。
以整数输出计算结果。
/ 是整数除法,商的小数部分向 0 舍去(7 / 2 = 3,-7 / 2 = -3,7 / -2 = -3)。
做 / 时如果 b 为 0,输出 "错误"。

输入
-1,000,000 ≤ a, b ≤ 1,000,000(整数),op 是 +、-、*、/ 之一
输出
一个整数结果,或 "错误"
样例 1 · stdin
-7 / 2
stdout
-3
样例 2 · stdin
1000000 * 1000000
stdout
1000000000000
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

负数除法的方向因语言而异。
C、C++、Java、C# 中整数 / 向 0 截断,-7 / 2 == -3;但 Python 的 // 是向下取整,结果是 -4。
Python 可以用 abs(a) // abs(b) 再补上符号,或用 int(a / b)(在本题范围内是精确的)。
JS/TS 的 / 总是浮点除法,Math.trunc(a / b) 才对,Math.floor 会掉进和 Python 一样的陷阱。
Craykon 的 / 也会得到 3.5,要用 数学.商(a, b)(向 0 截断)。
乘积最大到一万亿,C、Java、C# 的 int(最大约 21 亿)会溢出,要用 long long/long。
要先挡住除以 0:Java 抛出 ArithmeticException,C# 抛出 DivideByZeroException,C、C++ 是未定义行为(通常程序崩溃),JS 得到 Infinity/NaN。
选择分支:C、C++、Java、C#、JS 用 switch,Python 3.10+ 用 match。
Craykon 写成 选择 (op) { 情况 "+": … 默认: … },和 C# 一样不会落入下一个情况(结尾的 跳出; 可写可不写)。
C、C++、Java、JS 里漏写 break 会接着执行下一个 case。
JS 里 0 * -5 是 -0,而 console.log(-0) 会打印 -0,所以要用 String(…) 转换后输出。

Pythonmain.py · 16 行
a, op, b = input().split()a, b = int(a), int(b)match op:    case "+":        print(a + b)    case "-":        print(a - b)    case "*":        print(a * b)    case "/":        if b == 0:            print("错误")        else:            # Python의 // 는 내림(-7 // 2 == -4)이라 크기로 나눈 뒤 부호를 붙인다            q = abs(a) // abs(b)            print(q if (a < 0) == (b < 0) else -q)
JavaScriptmain.js · 12 行
const [x, op, y] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);const a = Number(x);const b = Number(y);let result;switch (op) {  case "+": result = a + b; break;  case "-": result = a - b; break;  case "*": result = a * b; break;  case "/": result = b === 0 ? "错误" : Math.trunc(a / b); break;}// String(-0) 은 "0" (console.log(-0) 은 "-0"을 찍는다)console.log(String(result));
TypeScriptmain.ts · 13 行
import { readFileSync } from "node:fs";const [x, op, y]: string[] = readFileSync(0, "utf8").trim().split(/\s+/);const a: number = Number(x);const b: number = Number(y);let result: number | string = "";switch (op) {  case "+": result = a + b; break;  case "-": result = a - b; break;  case "*": result = a * b; break;  case "/": result = b === 0 ? "错误" : Math.trunc(a / b); break;}// String(-0) 은 "0" (console.log(-0) 은 "-0"을 찍는다)console.log(String(result));
JavaMain.java · 18 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        long a = sc.nextLong();        String op = sc.next();        long b = sc.nextLong();        String result = switch (op) {            case "+" -> String.valueOf(a + b);            case "-" -> String.valueOf(a - b);            case "*" -> String.valueOf(a * b);            case "/" -> b == 0 ? "错误" : String.valueOf(a / b);            default -> "";        };        System.out.println(result);    }}
C#Main.cs · 20 行
using System; class Program{    static void Main()    {        string[] t = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        long a = long.Parse(t[0]);        long b = long.Parse(t[2]);        string result = t[1] switch        {            "+" => (a + b).ToString(),            "-" => (a - b).ToString(),            "*" => (a * b).ToString(),            "/" => b == 0 ? "错误" : (a / b).ToString(),            _ => "",        };        Console.WriteLine(result);    }}
C++main.cpp · 16 行
#include <iostream> int main() {    long long a, b;    char op;    std::cin >> a >> op >> b;    switch (op) {        case '+': std::cout << a + b << "\n"; break;        case '-': std::cout << a - b << "\n"; break;        case '*': std::cout << a * b << "\n"; break;        case '/':            if (b == 0) std::cout << "错误\n";            else std::cout << a / b << "\n";            break;    }}
Cmain.c · 17 行
#include <stdio.h> int main(void) {    long long a, b;    char op;    scanf("%lld %c %lld", &a, &op, &b);    switch (op) {        case '+': printf("%lld\n", a + b); break;        case '-': printf("%lld\n", a - b); break;        case '*': printf("%lld\n", a * b); break;        case '/':            if (b == 0) puts("错误");            else printf("%lld\n", a / b);            break;    }    return 0;}
Craykonmain.cray · 26 行
t = 控制台.读行().分割();a = t[0].转数字();op = t[1];b = t[2].转数字();选择 (op){    情况 "+":        控制台.输出(a + b);        跳出;    情况 "-":        控制台.输出(a - b);        跳出;    情况 "*":        控制台.输出(a * b);        跳出;    默认:        如果 (b == 0)        {            控制台.输出("错误");        }        否则        {            控制台.输出(数学.商(a, b));        }        跳出;}