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