关键是先把要传的数量存进一个新变量。 如果像 a = a - a / 2; b = b + a / 2; 那样算两次,第二行的 a 已经是减少后的值:从 7 颗里拿走 3 颗,却只给敏书 4 的一半,也就是 2 颗。 所以要像 give = a / 2 那样建一个变量,减的一方和加的一方用同一个值。 各语言声明变量的方法不同。 Python 和 Craykon 在第一次赋值时变量就产生了(Craykon give = 数学.商(a, 2);)。 JS、TS 用 const give = … 声明,还要再赋值的变量用 let。 TS 还可以像 const give: number 那样加上类型。 Java、C、C++ 像 int give = a / 2; 那样把类型写在前面;C# 的 var give、C++ 的 auto give 可以让类型由右边的值决定。 第二个陷阱是求一半的除法。 C、C++、Java、C# 的 int / 只留下商,但 Python 要用 //,JS/TS 用 Math.floor(a / 2),Craykon 用 数学.商(a, 2)。 JS、TS、Craykon 的 / 会把 7 / 2 算成 3.5。 第三,不能三个人都用最初的值来算。 敏书和夏俊给出的是包括前面收到的弹珠在内的一半。 所有值加起来也不过 300 万,int 就够了。
Pythonmain.py · 16 行
a, b, c = map(int, input().split())# 건넬 몫을 먼저 새 변수에 담아 두고, 주는 쪽과 받는 쪽에 같은 값을 쓴다give = a // 2a -= giveb += givegive = b // 2 # 민서는 방금 받은 구슬까지 센 수의 절반을 준다b -= givec += givegive = c // 2c -= givea += giveprint(a, b, c)
JavaScriptmain.js · 16 行
let [a, b, c] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 건넬 몫은 const로 한 번 만들고 두 번 쓴다(JS의 /는 소수까지 나누니 Math.floor)const give1 = Math.floor(a / 2);a -= give1;b += give1;const give2 = Math.floor(b / 2);b -= give2;c += give2;const give3 = Math.floor(c / 2);c -= give3;a += give3;console.log(`${a} ${b} ${c}`);
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); // int끼리 /는 몫만 남는다 int give = a / 2; a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; System.out.println(a + " " + b + " " + c); }}
C#Main.cs · 26 行
using System;class Program{ static void Main() { string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int a = int.Parse(p[0]); int b = int.Parse(p[1]); int c = int.Parse(p[2]); var give = a / 2; // var는 오른쪽을 보고 int로 정한다 a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; Console.WriteLine($"{a} {b} {c}"); }}
C++main.cpp · 20 行
#include <iostream>int main() { int a, b, c; std::cin >> a >> b >> c; auto give = a / 2; // auto는 오른쪽을 보고 int로 정한다 a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; std::cout << a << " " << b << " " << c << "\n";}
Cmain.c · 21 行
#include <stdio.h>int main(void) { int a, b, c; scanf("%d %d %d", &a, &b, &c); int give = a / 2; /* 건넬 몫을 먼저 담아 둔다 */ a -= give; b += give; give = b / 2; b -= give; c += give; give = c / 2; c -= give; a += give; printf("%d %d %d\n", a, b, c); return 0;}
Craykonmain.cray · 19 行
p = 控制台.读行().去空白().分割(" ");a = p[0].转数字();b = p[1].转数字();c = p[2].转数字();// 크레이콘은 처음 넣는 순간 변수가 생긴다. /는 소수까지 나누니 수학.몫준다 = 数学.商(a, 2);a = a - 준다;b = b + 준다;준다 = 数学.商(b, 2);b = b - 준다;c = c + 준다;준다 = 数学.商(c, 2);c = c - 준다;a = a + 준다;控制台.输出(a + " " + b + " " + c);