アルゴリズムコンテスト入門経典第2版練習問題2-5点数化小数
2162 ワード
初めてブログを出しましたが、フォーマットなどがよくわかりません.
練習問題2-5分数化小数(decimal)
正の整数a,b,cを入力し,a/bの小数形を出力し,小数点後のcビットに正確にする.a,b≤10⁶,c≤100.
入力には複数組のデータが含まれ、終了フラグはa=b=c=0である.
サンプル入力:
1 6 4
0 0サンプル出力:
Case 1: 0.1667
最近この本を読むついでにC言語を練習して、この問題を見たとき、いくつかの愚かさがあって、C++のsetprecisionでできるようです.
しかし、C言語を使うにはどうしたらいいか分からないので、ネットを調べてみましたが、印象に残っているのは、
これがsetprecision(c)のC言語版です(原理はまだ分かりませんが).
でも!やり方が間違っているようです!問題はc<=100を要求するが、上記のやり方はdoubleの精度(100未満)に依存し、
では、自分で除算をシミュレートするしかありません.また、自分のプログラミングの過程で多くのピットに気づきました.
1.正の整数a,b,c
2.末尾の位置を上げる
3.0.9999のように3桁の小数を残す
キャリーは前の一連の数字に影響するので、ループしながら出力する方法は、各桁を配列で格納する数字に置き換えられました.
うん、直すのはまだ長いですが、完成すると思ったら、いつもバグを見つけることができます.例えば、
1 2 1
4 4 4
998 999 100
以上はいくつかの典型的な例で、読者が自分で試してみるときにもっとテストしてみてください.
コードは次のとおりです.
練習問題2-5分数化小数(decimal)
正の整数a,b,cを入力し,a/bの小数形を出力し,小数点後のcビットに正確にする.a,b≤10⁶,c≤100.
入力には複数組のデータが含まれ、終了フラグはa=b=c=0である.
サンプル入力:
1 6 4
0 0サンプル出力:
Case 1: 0.1667
最近この本を読むついでにC言語を練習して、この問題を見たとき、いくつかの愚かさがあって、C++のsetprecisionでできるようです.
しかし、C言語を使うにはどうしたらいいか分からないので、ネットを調べてみましたが、印象に残っているのは、
printf("%.*f
",c,(double)a/(double)b);
これがsetprecision(c)のC言語版です(原理はまだ分かりませんが).
でも!やり方が間違っているようです!問題はc<=100を要求するが、上記のやり方はdoubleの精度(100未満)に依存し、
では、自分で除算をシミュレートするしかありません.また、自分のプログラミングの過程で多くのピットに気づきました.
1.正の整数a,b,c
2.末尾の位置を上げる
3.0.9999のように3桁の小数を残す
キャリーは前の一連の数字に影響するので、ループしながら出力する方法は、各桁を配列で格納する数字に置き換えられました.
うん、直すのはまだ長いですが、完成すると思ったら、いつもバグを見つけることができます.例えば、
1 2 1
4 4 4
998 999 100
以上はいくつかの典型的な例で、読者が自分で試してみるときにもっとテストしてみてください.
コードは次のとおりです.
#include
#include
int main()
{
int a, b, c;
const int Size = 101;//c<=100
int x_arr[Size] = {};//
while(scanf("%d%d%d", &a, &b, &c)){
if(!a && !b && !c)//a,b,c 0
break;
int x = a / b;//x
int y = a % b;//y
x_arr[0] = x;//
for (int i = 1; i <= c; i++)// c
{
if(y == 0)//
{
x_arr[i] = 0;// 0
}
else//
{
y *= 10;//
x = y / b;//
y = y % b;//
// ,
if(c == i)
{
int temp = x;//
y *= 10;
x = y / b;//
// 0.9999
if(x > 4 && temp == 9)
{
x_arr[i] = temp;//x_arr[c] = 9;
for (int j = c; j >= 0; j--) {//
if(x_arr[j] == 9 && j != 0)// +1
x_arr[j] = 0;
else
{
x_arr[j]++;//
break;
}
}
}
else if(x > 4)
x_arr[i] = temp + 1;
else
x_arr[i] = temp;
}
//
else
x_arr[i] = x;
}
}
printf("%d.",x_arr[0]);//
for (int k = 1; k <= c; k++)
printf("%d",x_arr[k]);//
printf("
");
}
return 0;
}