CF1857B Maximum Rounding 题解

题目描述

给定一个自然数 \(n\),可以对任意一位进行四舍五入,可以进行任意次,求能得到的最大数。(这里的 \(n\) 没有前导零)

思路

首先我们发现,如果我们将其中一位进位了,那后面的所有位都会变成 \(0\)
因此,如果我们进位了两次,那么位置靠后的那次进位,其实是没有用的。所以我们要从高位往低位找,找到第一个可以进位的数字,把他和他后面的数都变成 \(0\)。然后上一位 \(+1\)

但是,上一位可能进 \(1\) 之后,又可以进位了,所以要再次进位,直到无法进位为止。

例子:

  • 原序列:344910
  • 找到 \(9\)344910
  • 变成 \(0\)344000
  • 高位 \(+1\)345000
  • 进位 $ $:350000
  • 进位 $ $:400000

Code

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

char S[200005];
int T;

int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%s",S+1);  //防止进位时溢出
        S[0]='0';         //防止进位时溢出
        for(int i=1;S[i];i++){
            if(S[i]>='5'){
                int j=i-1;
                S[j]++;                          //高位+1
                for(int k=i;S[k];k++) S[k]='0';  //当前位及低位赋0
                while(S[j]>='5'){                //持续进位
                    S[j-1]++;
                    S[j]='0';
                    j--;
                }break;
            }
        }
        if(S[0]!='0') printf("%s\n",S);   //数字位数+1
        else          printf("%s\n",S+1); //数字位数不变
    }
    return 0;
}
posted @ 2024-02-24 17:19  Sundar_2022  阅读(19)  评论(0)    收藏  举报