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;
}
posted @ 2026-10-22 18:17  eruo  阅读(4)  评论(0)    收藏  举报