YTUOJ 2310: 文字列操作 4 (文字列)

質問の説明

文字列形式で小数を入力し、その精度を削除して、小数点以下 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は渡されていますが、よく考えてみるとこのコードにはバグがあり、数値が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;
}

操作状況は次のとおりです。すべての状況は質問の意味と一致しています。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/u014295602/article/details/103281175