YTUOJ 2310: 字符串操作四(串)

题目描述

以字符串形式输入一个小数,对其去精度,精确到小数点后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;
}

运行情况如下,各种情况均符合题意
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值