1. 程式人生 > >高精度小數(中國大學MOOC)(C語言)

高精度小數(中國大學MOOC)(C語言)

題目內容:
由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。
(0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將相除的結果以多個整數來表示,每個整數表示結果的一位。即商的第一位用一個整數來表示,第二位用另一個整數來表示,以此類推,就可以輸出一個高精度的除法結果了。
如16/19的結果0.8421052631...就可以依次輸出8、4、2、1、0、5、2、6、3、1...。
而除法的過程,則可以模仿人工列豎式做除法的方式,先將被除數乘以10,得到一位商以後,將餘數乘以10作為下一輪計算的被除數:
160/19->8餘8
80/19->4餘4
...
當某次餘數為0時,則表明除盡。
現在,請寫一個程式,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多小數點後200位。
輸入格式:

形如a/b的兩個數,其中10<=a<b<100。也就是說,這個小數一定是小於1的正數。
提示:輸入是帶著兩個數中間的“/”的,所以scanf應採用“%d/%d”這樣的輸入格式。
輸出格式:
形如0.xxxxxxxxx的小數,小數點後最多200位。輸出結束的時候要帶著回車換行。如果a/b是一個有限不迴圈小數,則輸出完所有的有效位就可以了,不需要再輸出後面的0來湊滿200位。
輸入樣例:
16/19
輸出樣例:

0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684

int main()
{
	int a,b;		//儲存除數和被除數 
	scanf("%d/%d",&a,&b);
	printf("0.");
	
	int cnt = 0;    //小數點後面的數,控制在200以內
	while(cnt<200)
	{
		a *= 10;
		printf("%d",a/b);
		if(a%b==0)
			break;			//如果除盡了,就結束 
		else
			a %= b;
		cnt++;
	}
	printf("\n");
	return 0;
}