{ }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.00 而不是 18.48。
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 " + 속력(전체거리, 전체시간) + " " + 페이스(전체시간, 전체거리));