Skip to content

M06: 空格分隔输出

http://noi.openjudge.cn/ch0101/06/

读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。

输入

共有四行: 第一行是一个字符; 第二行是一个整数; 第三行是一个单精度浮点数; 第四行是一个双精度浮点数。

输出

输出字符、整数、单精度浮点数和双精度浮点数,之间用空格分隔。

样例输入

a
12
2.3
3.2

样例输出

a 12 2.300000 3.200000

来源

习题(2-4)

这题目初衷是面向C++语言的。

cpp
#include <bits/stdc++.h>
using namespace std;

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

    char c;
    int n;
    float f1;
    double f2;

    if (!(cin >> c >> n >> f1 >> f2)) return 0;

    cout << c << ' ' << n << ' ' << fixed << setprecision(6) << f1 << ' ' << f2 << '\n';
    return 0;
}

Python 中没有严格的 单精度 / 双精度 区分,float 默认就是双精度浮点数。所以 Python 想 AC,必须在读到“单精度”的时候,先按 C++ float 精度截断一次,再输出。注意到 C++ 的 float/double 丢精度是二进制截断,在Python中struct 做二进制精度截断模拟。

struct.pack/unpack,它直接用二进制截断,和 C++ 的行为完全一致。

python
import struct

def to_c_float(x: float) -> float:
    # 先把 Python 的 float (C double) 按照 C float (4字节) 打包
    b = struct.pack('f', x)
    # 再解包回来变成 Python float,这时候数值精度已经被截断到 float 精度
    return struct.unpack('f', b)[0]


def main():
    c = input().strip()
    i = int(input().strip())
    f1 = float(input().strip())   # 读单精度
    f2 = float(input().strip())   # 读双精度

    f1 = to_c_float(f1)  # 模拟 C++ float 精度

    print(f"{c} {i} {f1:.6f} {f2:.6f}")

if __name__ == "__main__":
    main()
  • struct.pack('f', x)x单精度浮点数 (4字节, IEEE 754) 存储。
  • struct.unpack('f', …)[0] 再把 4 字节解析出来,转成 Python 的 float(C double),但精度已经丢失,只保留了单精度的部分。'f' 表示解析一个单精度浮点,所以返回的 tuple 里有 1 个元素;这里取 [0],拿到里面唯一的那个值。

这样就可以 模拟 C++ 里的 float 精度