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 国际」许可协议进行许可。
分类:
Codeforces
, 题解
标签:
Codeforces
, 题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】