習題2.9:分數化小數

題目:輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位

解法:一般會想到如下的解法,但實際上精確度是不夠的:

#include <stdio.h>

int main(){
	int a,b,c;
	while(scanf("%d%d%d",&a,&b,&c)==3)
		printf("%.*f\n",c,a*1.0/b);
	return 0;
}
例如,輸入 1 3 20的結果是:


正確做法應該是模擬數學裏面的除法公式,代碼如下:

#include <stdio.h>

int main(){
	int a,b,c,i;
	int digit,fac;
	while(scanf("%d%d%d",&a,&b,&c)==3){
		digit=a/b;
		printf("%d.",digit);
		fac=a%b;
		for (i=0;i<c;i++){
			fac*=10;
			digit=fac/b;
			printf("%d",digit);
			fac=fac%b;
		}
		printf("\n");
	}
	return 0;
}



當然這種解法也還有缺陷,未考慮末位的四捨五入問題。

不過題目似乎對於這種無限循環小數0.9999999....沒做約定?如果四捨五入,那值是等於1?。。

發佈了24 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章