{ }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 の方へ切り捨て)を使います。
積は最大 1 兆なので **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));        }        抜ける;}