{ }codelper
変数の宣言P0251

順番に渡すビー玉

ジウ、ミンソ、ハジュンの三人の友だちが、ビー玉をそれぞれ a 個、b 個、c 個持っている。
三人は次の順番で一回ずつビー玉を渡す。
1.
ジウが今持っているビー玉の半分をミンソに渡す。
2.
ミンソが今持っているビー玉の半分をハジュンに渡す。
3.
ハジュンが今持っているビー玉の半分をジウに渡す。
半分とは 2 で割った商で、余りは捨てる(7 個の半分は 3 個、1 個の半分は 0 個)。
「今持っている」ビー玉は、前の番で受け取った分も数えた数である。
一行に a、b、c が空白一つずつで区切って与えられる。
三回渡したあとにジウ、ミンソ、ハジュンが持っているビー玉の数を、この順に空白一つずつで区切って一行に出力せよ。

入力
0 ≤ a, b, c ≤ 1,000,000(整数)
出力
一行にジウ、ミンソ、ハジュンのビー玉の数(整数三つ)
例 1 · stdin
7 2 5
stdout
7 3 4
例 2 · stdin
10 0 0
stdout
6 3 1
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

渡す数を先に新しい変数に入れておくことがポイントです。
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 += give give = b // 2   # 민서는 방금 받은 구슬까지 센 수의 절반을 준다b -= givec += give give = c // 2c -= givea += give print(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}`);
TypeScriptmain.ts · 16 行
import { readFileSync } from "node:fs";let [a, b, c]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number); const give1: number = Math.floor(a / 2);a -= give1;b += give1; const give2: number = Math.floor(b / 2);b -= give2;c += give2; const give3: number = Math.floor(c / 2);c -= give3;a += give3; console.log(`${a} ${b} ${c}`);
JavaMain.java · 25 行
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);