题目描述
以字符串形式输入一个小数,对其去精度,精确到小数点后2位。测试数据有多组,一次性输入与输出。
样例输入
20
1.23
2.555
2.534
1.22222222
样例输出
20.00
1.23
2.56
2.53
1.22
此题并不复杂,主要是要综合考虑各种结果
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[120];
int i,n,point=0,l;
while(gets(a))
{
l=strlen(a);
for(i=0;i<l;i++) //寻找小数点位置
{
if(a[i]=='.')
{
point=i;
break;
}
}
if(i==l)
point=0;
printf("---%d\n",point);
if(point==0) //最简单的情况//没有小数点的情况,直接输出,后加.00
{
printf("%s.00\n",a);
}
else //有小数点需要分好几种情况处理
{
//当数字为XX.99Y这种情况,及进一位为XX.00/
if(a[point+1]=='9' && a[point+2]=='9' && a[point+3]>='5')
{
//a[point-1] = (a[point-1]+1)%10;
for(i=point-1;i>=0;i--)
{
a[i] = a[i]+1;
if(a[i]!='9'+1)
break;
else
a[i]='0';
}
for(i=0;i<=point;i++)
printf("%c",a[i]);
printf("00\n");
}
else if(a[point+2]=='\0') // 即只有一位小数的情况
{
for(i=0;a[i]!='\0';i++)
printf("%c",a[i]);
printf("0\n");
}
else //普通情况
{
for(i=l-1;i>point+2;i--)
{
if(a[i]>='5')
{
if(a[i-1]<='8')
a[i-1] += 1;
else
a[i-1] = '0';
}
}
for(i=0;i<=point+2;i++)
printf("%c",a[i]);
printf("\n");
}
}
printf("\n");
getchar();
}
system("pause");
return 0;
}
交上虽然AC,但我思考后发现这个代码有bug,其中若一个数字为x.994Yxxxxx,若按普通情况处理后Y的值为5,则需要进一,正确答案应该是(x+1).00,而上面的代码输出结果为x.90。
思考之后,想出了解决办法,由于一开始并未采用函数、递归等方法,而是一股脑扔在了main函数里,所以此处略显麻烦
思路如下:
经过普通处理后,增添一步判断是否为x.90Y,其中若Y>=5,即还需要进位,正确答案应该是(x+1).00
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char a[120];
int i,n,point=0,l;
while(gets(a))
{
l=strlen(a);
for(i=0;i<l;i++) //寻找小数点位置
{
if(a[i]=='.')
{
point=i;
break;
}
}
if(i==l)
point=0;
//printf("---%d\n",point);
if(point==0) //最简单的情况//没有小数点的情况,直接输出,后加.00
{
printf("%s.00\n",a);
}
else //有小数点需要分好几种情况处理
{
//当数字为XX.99Y这种情况,及进一位为XX.00/
if(a[point+1]=='9' && a[point+2]=='9' && a[point+3]>='5')
{
//a[point-1] = (a[point-1]+1)%10;
for(i=point-1;i>=0;i--)
{
a[i] = a[i]+1;
if(a[i]!='9'+1)
break;
else
a[i]='0';
}
for(i=0;i<=point;i++)
printf("%c",a[i]);
printf("00\n");
}
else if(a[point+2]=='\0') // 即只有一位小数的情况
{
for(i=0;a[i]!='\0';i++)
printf("%c",a[i]);
printf("0\n");
}
else //普通情况
{
for(i=l-1;i>point+2;i--)
{
if(a[i]>='5')
{
if(a[i-1]<='8')
a[i-1] += 1;
else
a[i-1] = '0';
}
}
///
//此部分为增加的判断
if(a[point+1]=='9' && a[point+2]=='0' && a[point+3]>='5')
{
//a[point-1] = (a[point-1]+1)%10;
for(i=point-1;i>=0;i--)
{
a[i] = a[i]+1;
if(a[i]!='9'+1)
break;
else
a[i]='0';
}
for(i=0;i<=point;i++)
printf("%c",a[i]);
printf("00\n");
}
else
{
for(i=0;i<=point+2;i++)
printf("%c",a[i]);
printf("\n");
}
//
}
}
printf("\n");
getchar();
}
//system("pause");
return 0;
}
运行情况如下,各种情况均符合题意