アルゴリズムコンテスト入門経典第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言語を使うにはどうしたらいいか分からないので、ネットを調べてみましたが、印象に残っているのは、
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; }