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 精度。