2025香港城市大学新生赛B题
典型的字符串题
题目概述
给你一个无比长的浮点数n,输出它四舍五入后到整数后的数.
example:n=6.7
输出:7
示例3:
24512251125124521514221435245612465234561326413461364134646246324631613463126134562596594265.591723568723145827126985输出:24512251125124521514221435245612465234561326413461364134646246324631613463126134562596594266
n中包含的数字位数不超过10^6,且必然存在小数点后位数
看到数字长度,是位数不超过10^6,而double一般只能保证15~17位数字,而且经过尝试,无法输出指定格式。所以就往字符串的方向考虑。初步想法是找到小数点的位置a,然后比较n[a+1]-‘0’和4的大小,有两种情况:
-
<=4
直接去掉小数部分即可,从n[0]遍历到n[a-1]输出即可 -
>=5 整数部分进位
注意:不能只考虑小数点前的一位,有可能出现如4999.65这样的数需要进若干位的数。同时,对于第一位的数字,进位有可能导致数字位数+1,如999.5变为1000 笔者第一次就忘了
对于这种需要进位的情况,我们从a-1开始前推,由于四舍五入只能进1,所以只需判定n[i]-‘0’是否大于九即可。
若不大于9,则令n[i]+1,进位结束,推出循环,从头输出即可
若大于9,则赋为‘0’(因为最大只能是9+1=10),然后接着循环直到不大于9或者到头;
特别的,若i==0时,数字第一位会多一个1,我们当然可以对字符串进行操作,但也可以直接在输出时先输出一个‘1’就行
代码如下
#include<bits/stdc++.h>
using namespace std;
string n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
int a = 0;
bool b = 0;
for (int i = 0; i < n.size();i++)
{
if(n[i]=='.')
a = i;
}//记录小数点
if(n[a+1]-'0'<5)
{
for (int i = 0; i < a;i++)
cout << n[i];
return 0;
}
//"四舍"的情况
for (int i = a - 1; i >= 0;i--)
{
if(n[i]-'0'+1<=9)
{
n[i]++;
break;
}
else
{
n[i] = '0';
if(i==0)
b = 1;//用bool变量b判断是否要输出'1'
}
}//"五入"
if(b)
cout << '1';
for (int i = 0; i < a;i++)
cout << n[i];
return 0;
}

浙公网安备 33010602011771号