渡す数を先に新しい変数に入れておくことがポイントです。 a = a - a / 2; b = b + a / 2; のように二回計算すると、二行目の a はもう減ったあとの値なので、7 個から 3 個を引いたのにミンソには 4 の半分の 2 個しか渡しません。 そこで give = a / 2 のように変数を一つ作り、引く側と足す側に同じ値を使います。 変数の作り方は言語ごとに違います。 Python と Craykon は give = … のように最初に値を入れた瞬間に変数ができます(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);