1. 程式人生 > >分數化小數

分數化小數

題目描述: 輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位,a,b<=10^6,c<=100 以三個0結束輸入。

分析: 開始想用C++的setprecision(x),後來一想,setprecision只能到小數點後16位(double的精確度範圍),因此需要手動模擬除法過程。很簡單,只需要先算出小數點前的數輸出,求得餘數。對於小數點後的數:先對餘數乘以10,除以b並輸出,再用取得的餘數作為除數迭代即可。 由於最後一位的下一位需要四捨五入,因此將迴圈設定為1到n-1,再計算n+1位即可。

程式碼:

#include<iostream>
#include<string>
#include<cstring>
#include<Windows.h>
#include<cmath>
using namespace std;
int main()
{
	int a, b, c, t1, t2;	//t1代表整數部分,t2代表小數部分
	int cnt = 1;
	while (scanf("%d%d%d", &a, &b, &c) == 3)
	{
		if (a == b && b == c) break;
		cout << "Case " << cnt++ << ": ";
		t1 = a / b;
		t2 = a - t1;
		cout << t1 << ".";
		for (int i = 1;i <= c-1;i++)
		{
			t2 *= 10;
			cout << t2 / b;
			t2 %= b;
		}
		t1 = ((t2 * 10 % b) * 10) / b;
		if (t1 >= 5) cout << t2 * 10 / b + 1;
		else cout << t2 * 10 / b;
		cout << endl;
	}
	system("pause");
	return 0;
}