NC200369 四舍五入(枚举)

题目描述:
四舍五入是个好东西。比如你只考了45分,四舍五入后你是50分再四舍五入你就是满分啦!qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是决定给他一个提高成绩的机会:让他的成绩可以在小数点后的任意位置四舍五入(也可以四舍五入为最接近的整数)。
但是这是有限制的。qdgg只能四舍五入t次。请帮助qdgg找到他在不超过t次四舍五入可获得的最高成绩。请注意,他可以选择不使用全部t次机会。此外,他甚至可以选择完全不对成绩进行四舍五入。
在这个问题中,使用经典的舍入规则:将数字四舍五入到第n个数字时,必须先看一下数字n + 1,如果小于5,则第n个数字将保持不变,而所有后续数字替换为0。否则,如果n + 1位数大于或等于5,则位置n处的位数将增加1(如果此位数等于9,这也可能会更改其他一些位数),并且随后的所有位数数字将替换为0。最后,所有尾随的零将被丢弃。
例如,如果将数字1.14舍入到小数点后第一位,则结果为1.1,而如果将1.5舍入到最接近的整数,则结果为2。四舍五入到小数点后第五位的数字1.299996121将得出数字1.3。
题目链接:
https://ac.nowcoder.com/acm/problem/200369
思路:
参考:https://ac.nowcoder.com/acm/problem/blogs/200369
首先要知道,四舍五入只能进行在小数部分,这也是为什么要用find。
其次,如果进行了一次四舍五入,那么后边的数字就都变成0了。
也就是说,不考虑进位的情况下,最多进行一次四舍五入操作。
那么如果考虑进位,在第一个大于“5”的位置,进行了四舍五入,可能会发生一系列连锁反应,导致一条进位链。
故思路如下:

  1. 在小数部分找到第一个大于等于5的数,将这位删掉,考虑前一位
  2. 前一位的情况只能是小数点或者是小于等于4的数字
  3. 首先考虑等于4的数字,因为只有等于4的时候,会在小数部分触发进位链,不断地检测上一位是否是4,直到上一位不是4或者次数被耗尽
  4. 此刻检测上一位是不是小数点,如果在整数部分发现了’9’,那么也会触发进位链,操作类似于3
  5. 最后,查看i是否等于-1,如果等于-1,意味着进位已经超出了原来的位数,那么直接打印一个1(进一位。如果不等于-1,意味着当前位不是9,可以+1操作。
  6. 剩下部分照常打印
    代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    int n,t;
    cin>>n>>t;
    string str;
    cin>>str;
    int pos=str.find('.');
    if(pos==-1)
    {
        cout<<str;
        return 0;
    }
    for(int i=pos+1;i<str.size();i++)
    {
        if(str[i]>='5')
        {
            str[i]='x';
            t--;
            i--;
            while(str[i]=='4' && t)
            {
                str[i]='x';
                i--;
                t--;
            }
            if(str[i]=='.')
            {
                str[i]='x';
                i--;
                while(str[i]=='9')
                {
                    str[i]='0';
                    i--;
                }
            }
            if(i==-1)
            {
                cout<<1;
            }
            else
            {
                str[i]+=1;
            }
            break;
        }
    }
    for(int i=0;i<str.size();i++)
    {
        if(str[i]=='x')
        {
            break;
        }
        cout<<str[i];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值