CSP202605A 银行家舍入
📅 2026/8/1 23:00:19
👁️ 阅读次数
📝 编程学习
小 P 的实验表格里有n个形如xxx.x的、保留一位小数的非负实数,其中:
- 小数点前的
xxx表示整数部分a,为任意非负整数; - 小数点后的
x表示小数部分b,为一位数字,取值0-9; - a可以是任意位数(如
2026、531或0);b必为一位,且当b=0时不会省略(如13.0)。
为方便统计分析,小 P 想将它们都近似为整数,具体定义两种计算方式。
- 四舍五入法
- 当0≤b≤4时,向下舍去,结果为a;
- 当5≤b≤9时,向上进位,结果为a+1。
- 银行家舍入法(向偶数舍入)
- 当b≠5时,处理与四舍五入法一致(b≤4向下,b≥6向上)。
- 当b=5时,由于a+0.5与相邻整数a和a+1的距离相同,为避免系统性偏差,向偶数舍入:若a为偶数,则结果为a;否则结果为a+1。
现给出小P表格中的n个实数(格式如上)。对每个实数,分别计算上述两种方法的取整结果。
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; int a,b; char dot; vector<int> ans1,ans2; for(int i=0;i<n;i++){ cin>>a>>dot>>b; int a1=b<=4?a:a+1; int a2; if(b!=5) a2=a1; else a2=a%2==0?a:a+1; ans1.push_back(a1); ans2.push_back(a2); } for(int i=0;i<n;i++){ if(i) cout<<" "; cout<<ans1[i]; } cout<<endl; for(int i=0;i<n;i++){ if(i) cout<<" "; cout<<ans2[i]; } return 0; }这是道很简单的题目,值得注意的点是:
ios::sync_with_stdio(false); cin.tie(nullptr);关掉cin/cout和stdio(scanf/printf)的同步,并把cin和它绑定的输出流解绑,让cin/cout跑得跟scanf/printf一样快。
不用scanf/printf是不用写格式符,太麻烦了,这个方法能使用更方便的cin/cout。
1.ios::sync_with_stdio(false);
C++ 中为了能混用cin/cout和scanf/printf,会把它们绑定到同一套缓冲区,每次 I/O 都要做同步检查,代价很大。这个语句使得cin/cout不再跟scanf/printf同步,速度大幅提升(接近scanf/printf)。2.cin.tie(nullptr);
cin 和 cout 是"绑定的"——每次执行 cin 之前,会自动调用 cout.flush(),把缓冲区里的东西先输出出去。这个语句解绑cin和cout,不再每次cin前自动flush。
编程学习
技术分享
实战经验