{ }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 在第一次赋值时变量就产生了(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);