auj 590 四舍五入

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=590

题目描述

四舍五入是程序设计中很头疼的精度误差问题。现在有一种新的四舍五入规定。

对于一个实数的取整,分为以下几种情况:

1、整数部分的最后一位不是9,小数部分小于0.5,那么取整之后保留整数部分不作处理

2、整数部分的最后一位不是9,小数部分不小于0.5,那么取整之后,整数部分需要加1。

3、整数部分的最后一位是9,那么进位将会是一位很麻烦的事情,所以规定保留整数部分不处理。

给出一个实数,输出取整之后的情况。

一个整数 T,表示有 T 组测试数据。(1<=T<=100)每组数据输入格式如下:

给出一个非负实数,也可能是个整数,数的长度<=1000。

对于每组数据,输出取整之后的结果,不要输出前导0.
如不要输出000034,应该输出34

Sample Input

3

1.234

1.823

9.643

Sample Output

1

2

9

方法与总结

  • 直接用字符串处理,判断小数点前后情况
  • 注意输出没有前导0,在消除前导0的时候应注意特殊情况

代码

#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s,str;
        cin>>s;
        while(s[0]=='0' && s[1]!='.' && s!="0")//去掉前导0,注意类似于0.5和全0的情况 
            s=s.substr(1,s.length()-1);
        int mark=0;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]=='.')
            {
                if(s[i-1]=='9')
                    str=s.substr(0,i);
                else if(s[i+1]>='5')
                    {
                        s[i-1]+=1;
                        str=s.substr(0,i);
                    }
                else
                    str=s.substr(0,i);
                mark=1;
            }
        }
        if(mark==0)
            cout<<s<<endl;
        else
            cout<<str<<endl;
     }
    return 0;
}
/* bottom:40px 距浏览器底部距离 right:40px 距浏览器右边距离 */