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;
}

作者:Sundar-2022

出处:https://www.cnblogs.com/Sundar-2022/p/18031326

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Sundar_2022  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示