質問の説明
文字列形式で小数を入力し、その精度を削除して、小数点以下 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;
}
操作状況は次のとおりです。すべての状況は質問の意味と一致しています。