• 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
    #include
    #include
    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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    Sentinel浅层介绍(上)
    STM32进阶笔记——复位、时钟与滴答定时器
    N沟道场效应管 FDA69N25深度图解 工作原理应用
    SingleTreePolicyInterpreter
    点成分享 | 水浴设备在食品生物活性测定中的应用
    15经验模态分解及其改进程序,EMD,EEMD, CEEMDAN,三合一程序,已调试完成,替换自己数据可直接跑。
    怎么配置Maven的镜像仓库才是正确的
    【ARM Coresight 系列文章 3.3 - ARM Coresight SWD 协议详细介绍】
    swoole进行性能查看火焰图tideways_xhprof xhgui
    利用手机摄像头采集图片运行ORB-SLAM2
  • 原文地址:https://blog.csdn.net/weixin_50616227/article/details/126194773