{ }codelper
数の読み込み小数の出力型変換P0162

自転車の区間記録の整理

自転車のサイクルコンピューターが n 個の区間ごとに走った距離(メートル)とかかった時間(秒)を整数で記録した。
一行目に n、二行目に区間の距離 n 個、三行目に区間の時間 n 個が空白区切りで与えられる。
区間ごとに一行に速さとペースを空白一つで区切って出力せよ。
速さは時速キロメートル(距離 ÷ 時間 × 3.6)で、小数第二位まで四捨五入してちょうど二桁で書く(18 は 18.00)。
ペースは 1km 進むのにかかる秒数(時間 × 1000 ÷ 距離)の小数部分を切り捨てた整数 p を「分:秒」の形で書いたものである。
分は p を 60 で割った商で、前に 0 を付けず(3 分は 3、0 分は 0)、60 以上でも時間に直さない。
秒は p を 60 で割った余りで、常に二桁で書く(5 秒は 05)。
最後の行には "TOTAL"、全体の速さ、全体のペースを空白一つずつで区切って出力せよ。
全体の速さとペースは区間の値の平均ではなく、距離の合計と時間の合計から上と同じように求める。
四捨五入で迷わないように、出力するすべての速さ(全体の速さを含む)は 100 倍したときの小数部分が 0.4 以下か 0.6 以上になるように与えられる。

入力
1 ≤ n ≤ 5000、1 ≤ 距離 ≤ 100000、1 ≤ 時間 ≤ 36000。
すべて整数
出力
n + 1 行。
区間ごとに "速さ 分:秒"、最後の行に "TOTAL 速さ 分:秒"
例 1 · stdin
3
1000 5000 2500
200 600 487
stdout
18.00 3:20
30.00 2:00
18.48 3:14
TOTAL 23.78 2:31
main.py
入力(stdin)

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

$ 準備完了

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

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

数の型が変わるタイミングが要です。
C・C++・Java・C# では int 同士の / は商だけを残すので、速さは割る前に片方を実数に変えます:(double) m / s * 3.6。
(double) (m / s) のように括弧で囲むとすでに整数で割った後なので、例の三つ目の区間の 2500 ÷ 487 が 5 になり、18.48 ではなく 18.00 が出ます。
Python 3・JS・TS・Craykon の / は常に実数の割り算なのでこの落とし穴はありませんが、逆にペースの切り捨てを別にする必要があります:Python //、JS・TS Math.floor、Craykon 数学.切り下げ(分は 数学.商(p, 60))。
Craykon で切り下げずに p % 60 とすると 20.5 秒のような値が出ます。
切り捨ての代わりに四捨五入(round)すると 61.66 秒が 1:02 になります。
全体のペースは全体の時間 × 1000 なので、5000 区間 × 36000 秒なら 1800 億で int(約 21 億)を超えます:C・C++ は long long、Java・C# は long で集めます。
JS・TS・Craykon の数は 2^53 まで正確なので大丈夫です。
数をたくさん読むには Python map(int, input().split())、JS・TS は一度に読んで split(/\s+/)、Java StringTokenizer、C# Split + int.Parse、C scanf("%d")、C++ cin >>、Craykon コンソール.数読み()。
小数二桁は Python f"{x:.2f}"、JS・TS toFixed(2)、C・C++ printf("%.2f")、Java String.format(Locale.ROOT, "%.2f", x)、C# ToString("F2", CultureInfo.InvariantCulture)、Craykon 文字.桁そろえ(x, 2)。
秒を二桁に埋めるのも忘れずに:%02d、padStart(2, "0")、D2、Craykon 前埋め(2, "0")。
そして全体の速さは区間の速さの平均ではありません:例では平均は 22.16 ですが、全体の距離 ÷ 全体の時間は 23.78 です。

Pythonmain.py · 17 行
def pace(seconds, meters):    # 1km에 걸리는 초 = seconds × 1000 ÷ meters, 소수 부분은 버린다(정수 나눗셈 //)    p = seconds * 1000 // meters    return f"{p // 60}:{p % 60:02d}"  def speed(meters, seconds):    return f"{meters / seconds * 3.6:.2f}"  # 파이썬 3의 / 는 늘 실수 나눗셈  n = int(input())ds = list(map(int, input().split()))ts = list(map(int, input().split()))for d, t in zip(ds, ts):    print(speed(d, t), pace(t, d))total_d, total_t = sum(ds), sum(ts)print("TOTAL", speed(total_d, total_t), pace(total_t, total_d))
JavaScriptmain.js · 20 行
const [n, ...rest] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const ds = rest.slice(0, n);const ts = rest.slice(n, 2 * n); const speed = (m, s) => ((m / s) * 3.6).toFixed(2);const pace = (s, m) => {  const p = Math.floor((s * 1000) / m); // JS의 / 는 실수 나눗셈이라 버림을 따로 한다  return `${Math.floor(p / 60)}:${String(p % 60).padStart(2, "0")}`;}; const out = [];let totalD = 0;let totalT = 0;for (let i = 0; i < n; i++) {  out.push(`${speed(ds[i], ts[i])} ${pace(ts[i], ds[i])}`);  totalD += ds[i];  totalT += ts[i];}out.push(`TOTAL ${speed(totalD, totalT)} ${pace(totalT, totalD)}`);console.log(out.join("\n"));
TypeScriptmain.ts · 23 行
import { readFileSync } from "node:fs";const [n, ...rest]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const ds: number[] = rest.slice(0, n);const ts: number[] = rest.slice(n, 2 * n); function speed(m: number, s: number): string {  return ((m / s) * 3.6).toFixed(2);}function pace(s: number, m: number): string {  const p: number = Math.floor((s * 1000) / m); // number 하나뿐이라 버림을 따로 한다  return `${Math.floor(p / 60)}:${String(p % 60).padStart(2, "0")}`;} const out: string[] = [];let totalD = 0;let totalT = 0;for (let i = 0; i < n; i++) {  out.push(`${speed(ds[i], ts[i])} ${pace(ts[i], ds[i])}`);  totalD += ds[i];  totalT += ts[i];}out.push(`TOTAL ${speed(totalD, totalT)} ${pace(totalT, totalD)}`);console.log(out.join("\n"));
JavaMain.java · 41 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Locale;import java.util.StringTokenizer; public class Main {    static int[] readInts(BufferedReader in, int n) throws IOException {        StringTokenizer st = new StringTokenizer(in.readLine());        int[] a = new int[n];        for (int i = 0; i < n; i++) a[i] = Integer.parseInt(st.nextToken());        return a;    }     // 나누기 전에 double로 바꾼다: (double) (m / s)는 이미 정수로 나눈 뒤라 늦다    static String speed(long m, long s) {        return String.format(Locale.ROOT, "%.2f", (double) m / s * 3.6);    }     // long끼리 나누면 소수 부분이 버려진다. 전체 시간 × 1000은 int를 넘는다    static String pace(long s, long m) {        long p = s * 1000 / m;        return String.format("%d:%02d", p / 60, p % 60);    }     public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        int[] ds = readInts(in, n);        int[] ts = readInts(in, n);        StringBuilder out = new StringBuilder();        long totalD = 0, totalT = 0;        for (int i = 0; i < n; i++) {            out.append(speed(ds[i], ts[i])).append(' ').append(pace(ts[i], ds[i])).append('\n');            totalD += ds[i];            totalT += ts[i];        }        out.append("TOTAL ").append(speed(totalD, totalT)).append(' ').append(pace(totalT, totalD)).append('\n');        System.out.print(out);    }}
C#Main.cs · 34 行
using System;using System.Globalization;using System.Linq;using System.Text; class Program{    // 나누기 전에 double로: (double)(m / s)는 정수로 나눈 뒤라 늦다    static string Speed(long m, long s) => ((double)m / s * 3.6).ToString("F2", CultureInfo.InvariantCulture);     // long끼리 나누면 소수 부분이 버려진다. 전체 시간 × 1000은 int를 넘는다    static string Pace(long s, long m)    {        long p = s * 1000 / m;        return $"{p / 60}:{p % 60:D2}";    }     static void Main()    {        int n = int.Parse(Console.ReadLine());        int[] ds = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        int[] ts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        var sb = new StringBuilder();        long totalD = 0, totalT = 0;        for (int i = 0; i < n; i++)        {            sb.Append(Speed(ds[i], ts[i])).Append(' ').Append(Pace(ts[i], ds[i])).Append('\n');            totalD += ds[i];            totalT += ts[i];        }        sb.Append("TOTAL ").Append(Speed(totalD, totalT)).Append(' ').Append(Pace(totalT, totalD)).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 36 行
#include <cstdio>#include <iostream>#include <vector> // 나누기 전에 double로: static_cast<double>(m / s)는 정수로 나눈 뒤라 늦다void printSpeed(long long m, long long s) {    std::printf("%.2f", static_cast<double>(m) / s * 3.6);} // long long끼리 나누면 소수 부분이 버려진다. 전체 시간 × 1000은 int를 넘는다void printPace(long long s, long long m) {    long long p = s * 1000 / m;    std::printf("%lld:%02lld", p / 60, p % 60);} int main() {    int n;    std::cin >> n;    std::vector<int> ds(n), ts(n);    for (int& d : ds) std::cin >> d;    for (int& t : ts) std::cin >> t;    long long totalD = 0, totalT = 0;    for (int i = 0; i < n; i++) {        printSpeed(ds[i], ts[i]);        std::printf(" ");        printPace(ts[i], ds[i]);        std::printf("\n");        totalD += ds[i];        totalT += ts[i];    }    std::printf("TOTAL ");    printSpeed(totalD, totalT);    std::printf(" ");    printPace(totalT, totalD);    std::printf("\n");}
Cmain.c · 36 行
#include <stdio.h> static int ds[5000], ts[5000]; /* 나누기 전에 double로: (double)(m / s)는 정수로 나눈 뒤라 늦다 */static void print_speed(long long m, long long s) {    printf("%.2f", (double)m / s * 3.6);} /* long long끼리 나누면 소수 부분이 버려진다. 전체 시간 × 1000은 int를 넘는다 */static void print_pace(long long s, long long m) {    long long p = s * 1000 / m;    printf("%lld:%02lld", p / 60, p % 60);} int main(void) {    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) scanf("%d", &ds[i]);    for (int i = 0; i < n; i++) scanf("%d", &ts[i]);    long long total_d = 0, total_t = 0;    for (int i = 0; i < n; i++) {        print_speed(ds[i], ts[i]);        putchar(' ');        print_pace(ts[i], ds[i]);        putchar('\n');        total_d += ds[i];        total_t += ts[i];    }    printf("TOTAL ");    print_speed(total_d, total_t);    putchar(' ');    print_pace(total_t, total_d);    putchar('\n');    return 0;}
Craykonmain.cray · 25 行
속력(m, s){    返す 文字.桁そろえ(m / s * 3.6, 2);} // 크레이콘의 / 는 늘 소수까지 나눈다: 버림은 수학.내림으로페이스(s, m){    p = 数学.切り下げ(s * 1000 / m);    초 = "" + p % 60;    返す 数学.商(p, 60) + ":" + 초.前埋め(2, "0");} n = コンソール.行読み().数に();거리들 = コンソール.数読み();시간들 = コンソール.数読み();전체거리 = 0;전체시간 = 0;繰り返す (i = 0; i < n; i++){    コンソール.書く(속력(거리들[i], 시간들[i]) + " " + 페이스(시간들[i], 거리들[i]));    전체거리 += 거리들[i];    전체시간 += 시간들[i];}コンソール.書く("TOTAL " + 속력(전체거리, 전체시간) + " " + 페이스(전체시간, 전체거리));