{ }codelper
浮点除法P0314

罚球命中率记录表

篮球队的记录表上写着 n 名选手的罚球记录。
第一行给出 n。
接下来的 n 行,每行给出一名选手投进的次数 m 和投出的次数 t,用一个空格分开。
选手的命中率是 m 除以 t 再乘以 100 的值。
按给出的顺序,每名选手占一行,输出四舍五入到小数点后一位的命中率。
小数点后第一位即使是 0 也必须写出(50.0、100.0),不加百分号。
一次也没有投过的选手(t 为 0)无法确定命中率,所以该行只输出一个减号 -。

输入
1 ≤ n ≤ 100,0 ≤ m ≤ t ≤ 1000(均为整数)。
不会给出使命中率乘以 10 后小数部分恰好为 0.5 的输入
输出
n 行。
每行是保留一位小数的命中率,或 -
样例 1 · stdin
4
1 2
2 3
0 0
7 7
stdout
50.0
66.7
-
100.0
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

两个整数相除时,/ 的行为因语言而异。
在 C、C++、Java、C# 中,int 之间的 / 只留下商。
所以 m / t * 100 对 2 3 会先把 2 / 3 算成 0,输出 0.0(样例中的 1 2 也是 0.0)。
换个顺序写成 m * 100 / t 仍是 int 相除,得到 66,输出 66.0。
必须在除之前把一边变成实数,例如 (double) m。
只把结果存进 double 变量已经晚了。
Python 3 的 / 即使是整数之间也会除到小数,只留商的是 //。
写成 m * 100 // t 在这里同样得到 66.0。
JS、TS 只有一种数,/ 总是除到小数,Craykon 的 / 也一样。
除以 0 时也不同。
不先问 t 是否为 0 的话,Python 会因 ZeroDivisionError 停下。
JS、TS 不报错,0 / 0 变成 NaN 并原样输出 NaN。
C、C++、Java、C# 在转成实数之后的 0 / 0 也不是错误,而是“不是数”这个值,C 会输出 nan(有的环境是 -nan)。
Craykon 的 0 / 0 也是一个不是数的值,字符.保留小数 收到它就会停下。
无论哪种语言,都要在除之前先问 t 是否为 0。
这时输出 0.0 也是错的。
没有投过球的选手的命中率不是 0,而是无法确定的值,所以输出 -。
保留一位小数的写法:Python f"{x:.1f}",JS/TS x.toFixed(1),C printf("%.1f"),C++ std::fixed << std::setprecision(1),Java String.format("%.1f", x),C# x.ToString("F1"),Craykon 字符.保留小数(x, 1)。
不处理直接输出的话,JS 会得到 50 和 66.66666666666666。

Pythonmain.py · 8 行
n = int(input())for _ in range(n):    m, t = map(int, input().split())    if t == 0:        print("-")   # 0으로 나누면 ZeroDivisionError — 나누기 전에 먼저 묻는다    else:        # Python 3의 /는 정수끼리도 소수까지 나눈다(//는 몫만)        print(f"{m / t * 100:.1f}")
JavaScriptmain.js · 9 行
const [n, ...v] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];for (let i = 0; i < n; i++) {  const m = v[2 * i];  const t = v[2 * i + 1];  // JS의 0 / 0은 오류가 아니라 NaN이다 — 나누기 전에 먼저 묻는다  out.push(t === 0 ? "-" : ((m / t) * 100).toFixed(1));}console.log(out.join("\n"));
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const [n, ...v]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: string[] = [];for (let i = 0; i < n; i++) {  const m: number = v[2 * i];  const t: number = v[2 * i + 1];  // 0 / 0은 오류가 아니라 NaN이다 — 나누기 전에 먼저 묻는다  out.push(t === 0 ? "-" : ((m / t) * 100).toFixed(1));}console.log(out.join("\n"));
JavaMain.java · 22 行
import java.util.Locale;import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            int m = sc.nextInt();            int t = sc.nextInt();            if (t == 0) {                out.append("-\n");            } else {                // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다                double rate = (double) m / t * 100;                out.append(String.format(Locale.ROOT, "%.1f", rate)).append('\n');            }        }        System.out.print(out);    }}
C#Main.cs · 29 行
using System;using System.Globalization;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        var sb = new StringBuilder();        for (int i = 0; i < n; i++)        {            string[] p = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);            int m = int.Parse(p[0]);            int t = int.Parse(p[1]);            if (t == 0)            {                sb.Append("-\n");            }            else            {                // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다                double rate = (double)m / t * 100;                sb.Append(rate.ToString("F1", CultureInfo.InvariantCulture)).Append('\n');            }        }        Console.Write(sb);    }}
C++main.cpp · 19 行
#include <iomanip>#include <iostream> int main() {    int n;    std::cin >> n;    std::cout << std::fixed << std::setprecision(1);    for (int i = 0; i < n; i++) {        int m, t;        std::cin >> m >> t;        if (t == 0) {            std::cout << "-\n";        } else {            // 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다            double rate = static_cast<double>(m) / t * 100;            std::cout << rate << "\n";        }    }}
Cmain.c · 18 行
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    for (int i = 0; i < n; i++) {        int m, t;        scanf("%d %d", &m, &t);        if (t == 0) {            puts("-");        } else {            /* 나누기 전에 한쪽을 double로 바꿔야 소수가 남는다 */            double rate = (double)m / t * 100;            printf("%.1f\n", rate);        }    }    return 0;}
Craykonmain.cray · 16 行
n = 控制台.读行().转数字();循环 (i = 0; i < n; i++){    기록 = 控制台.读数字();    m = 기록[0];    t = 기록[1];    如果 (t == 0)    {        控制台.输出("-");    }    否则    {        // 크레이콘의 /는 늘 소수까지 나눈다        控制台.输出(字符.保留小数(m / t * 100, 1));    }}