计算浮点数相除的余

GitHub跳转原题关系图返回列表

浮点取余直接按定义落地:math.fmod 给出精确余数 r=a-k·b,再用 .6g 按 6 位有效数字输出,与 C++ cout 参考解逐字一致。

OJ: roj

题目 ID: 1029

难度:入门

标签:入门输入输出浮点数python

创建: 2026-09-29 14:06

更新: 2026-10-04 22:52

题目描述

给定两个双精度浮点数 aa、bb,求余数 rr,使 a=k×b+ra = k \times b + r、kk 为整数且 0≤r<b0 \le r < b。输入一行两个双精度浮点数;输出一行余数。 样例输入:73.263 0.9973 样例输出:0.4601

思路

直接调用 fmod(a, b) 得到精确余数(IEEE-754 保证结果落在 [0,∣b∣)[0, |b|)),再用 cout 以默认 6 位有效数字输出即可。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 14:08
# update_at: 2026-09-29 14:08

import sys
import math


def remainder(a: float, b: float) -> float:
    """a 除以 b 的余数 r:满足 a = k*b + r(k 为整数,0 <= r < b)。"""
    # fmod 直接给出精确余数,比 a - int(a/b)*b 少一次乘法回代的舍入误差
    return math.fmod(a, b)


def solve() -> None:
    data = iter(map(float, sys.stdin.buffer.read().split()))
    a = next(data)
    b = next(data)
    # 题面样例与评测数据按 6 位有效数字输出(与 C++ cout 默认精度一致)
    print(f"{remainder(a, b):.6g}")


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-04 22:52
 * update_at: 2026-10-04 22:52
 */
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

double a, b; // 输入:两个双精度浮点数

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> a >> b;

    // fmod(a, b) 按 IEEE-754 定义给出精确余数 r,满足 a = k*b + r 且 0 <= r < |b|
    double r = fmod(a, b);

    // cout 默认精度为 6 位有效数字,与题面期望输出一致
    cout << r << endl;

    return 0;
}