{ }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));    }}