弟弟做了加法作业。 要逐个批改算式,并把错误的答案改正。 第一行给出算式的个数 n。 接下来 n 行,每行给出弟弟写的一个算式,形式为 "a + b = c"。 a、b、c 都是整数,数与符号之间恰好各有一个空格。 负数前面写 -(例如 -8 + 3 = -5)。 数只用数字书写,不带逗号,前面不加 0 或 +。 0 不写成 -0。 每个算式输出一行批改结果。 如果 c 等于 a + b,输出 "O a + b = c"。 如果 c 不等于 a + b,输出 "X a + b = s",其中 s 是 a + b 的正确值。 输出的数也和输入一样只用数字书写,不带逗号。 最后一行输出错误算式的个数。
输入
1 ≤ n ≤ 1,000,-1,500,000,000 ≤ a, b ≤ 1,500,000,000,-3,000,000,000 ≤ c ≤ 3,000,000,000
O 1500000000 + 1500000000 = 3000000000
X 1500000000 + 1500000000 = 3000000000
1
main.py
错误列表00F8 ↓ · ⇧F8 ↑
输入(stdin)
运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。
$ 就绪
请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。
其他语言怎么写?查看各语言题解 · 8 种语言题解
第一个陷阱是同一个 + 既做加法又做字符串拼接。 JS/TS 用 split(" ") 分出的片段是字符串,不用 Number 转换的话 "3" + "4" 会变成 "34",弟弟写错的答案 34 反而被判为正确(TS 写成 number[] 时类型检查会提醒)。 Craykon 不用 转数字() 就相加,也会同样拼接。 Python 中 "3" + "4" 也是 "34",但字符串和数相加会报错。 Java、C#、JS 一遇到字符串,就会从左到右把后面的内容都拼接起来,所以 "= " + a + b 变成 = 34。 要先用 s = a + b 求出和,或者像 (a + b) 那样加括号。 第二个陷阱是大小。 a 和 b 最大 15 亿,和最大到 30 亿,而 C、C++、Java、C# 的 int 只到约 21 亿,会溢出。 C# 和 Java 溢出时不报错,悄悄变成负数(C# 只有放在 checked 里才会报告),C、C++ 的有符号整数溢出是未定义行为。 所以 C 用 long long 和 scanf("%lld + %lld = %lld"),C++ 用 long long,Java、C# 用 long 读入。 Python 整数没有大小限制,JS、TS、Craykon 的数在 2^53 以内都精确,30 亿没有问题。
Pythonmain.py · 14 行
n = int(input())out = []wrong = 0for _ in range(n): a, plus, b, eq, c = input().split() a, b, c = int(a), int(b), int(c) # 문자열끼리 +하면 이어 붙는다("3" + "4" → "34") s = a + b if s == c: out.append(f"O {a} + {b} = {s}") else: out.append(f"X {a} + {b} = {s}") wrong += 1out.append(str(wrong))print("\n".join(out))
JavaScriptmain.js · 17 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const out = [];let wrong = 0;for (let i = 1; i <= n; i++) { // 빈칸으로 나눈 조각은 문자열이라 Number로 바꿔야 +가 덧셈이 된다 const [a, , b, , c] = lines[i].trim().split(" ").map(Number); const s = a + b; if (s === c) { out.push(`O ${a} + ${b} = ${s}`); } else { out.push(`X ${a} + ${b} = ${s}`); wrong++; }}out.push(String(wrong));console.log(out.join("\n"));
TypeScriptmain.ts · 18 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const out: string[] = [];let wrong = 0;for (let i = 1; i <= n; i++) { // 빈칸으로 나눈 조각은 문자열이라 Number로 바꿔야 +가 덧셈이 된다 const [a, , b, , c]: number[] = lines[i].trim().split(" ").map(Number); const s: number = a + b; if (s === c) { out.push(`O ${a} + ${b} = ${s}`); } else { out.push(`X ${a} + ${b} = ${s}`); wrong++; }}out.push(String(wrong));console.log(out.join("\n"));
JavaMain.java · 29 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); StringBuilder out = new StringBuilder(); int wrong = 0; for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); // 합이 30억까지 가니 int(약 21억)가 아니라 long으로 받는다 long a = Long.parseLong(p[0]); long b = Long.parseLong(p[2]); long c = Long.parseLong(p[4]); long s = a + b; char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } // 문자열 뒤에서 + a + b를 쓰면 이어 붙으니 합은 s로 따로 구해 둔다 out.append(mark).append(' ').append(a).append(" + ").append(b).append(" = ").append(s).append('\n'); } out.append(wrong).append('\n'); System.out.print(out); }}
C#Main.cs · 30 行
using System;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); var sb = new StringBuilder(); int wrong = 0; for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); // 합이 30억까지 가니 int가 아니라 long으로 받는다 long a = long.Parse(p[0]); long b = long.Parse(p[2]); long c = long.Parse(p[4]); long s = a + b; char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } sb.Append($"{mark} {a} + {b} = {s}\n"); } sb.Append(wrong).Append('\n'); Console.Write(sb); }}
C++main.cpp · 20 行
#include <iostream>int main() { std::ios::sync_with_stdio(false); int n, wrong = 0; std::cin >> n; for (int i = 0; i < n; i++) { long long a, b, c; char plus, eq; std::cin >> a >> plus >> b >> eq >> c; long long s = a + b; // int로 더하면 30억에서 넘친다 char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } std::cout << mark << ' ' << a << " + " << b << " = " << s << "\n"; } std::cout << wrong << "\n";}
Cmain.c · 20 行
#include <stdio.h>int main(void) { int n, wrong = 0; long long a, b, c; scanf("%d", &n); for (int i = 0; i < n; i++) { /* 형식 문자열의 " + "와 " = "가 기호를 건너뛰어 준다 */ scanf("%lld + %lld = %lld", &a, &b, &c); long long s = a + b; /* int로 더하면 30억에서 넘친다 */ char mark = 'O'; if (s != c) { mark = 'X'; wrong++; } printf("%c %lld + %lld = %lld\n", mark, a, b, s); } printf("%d\n", wrong); return 0;}
Craykonmain.cray · 19 行
n = 控制台.读行().转数字();wrong = 0;循环 (i = 0; i < n; i++){ p = 控制台.读行().去空白().分割(" "); // 나눈 조각은 문자열이라 수로변환해야 +가 덧셈이 된다 a = p[0].转数字(); b = p[2].转数字(); c = p[4].转数字(); s = a + b; mark = "O"; 如果 (s != c) { mark = "X"; wrong++; } 控制台.输出(mark + " " + a + " + " + b + " = " + s);}控制台.输出(wrong);