1. 程式人生 > >演算法入門練習No.9:分數化小數(decimal)

演算法入門練習No.9:分數化小數(decimal)

輸入正整數a、b、c,輸出a/b的小數形式,精確到小數點後c位。其中a、b≤1000000,c≤100。

(這道題目的確是想到了把小數放大然後取模再決定末尾的四捨五入,但還是很頭大,結果瞄了一下別人的,發現分兩部分輸出就不用再把放大了的小數再頭疼地變回小數!!!沒想到啊豈可修)

(雖然我結果出來了,但還是有點迷迷糊糊的,指不定以後給我看我還會覺得自己的做法有點奇葩……先這樣吧)

#include <stdio.h>
#include <math.h>
int main()
{
	int a,b,c,zxs;//zxs是用於放置轉換為整型的小數xs
	double d,xs;
	scanf("%d%d%d",&a,&b,&c);
	d = a*1.0;
	printf("%d.",(int)d/b);
	xs = d/b - (int)d/b;//小數部分
	for(; c > 0 ; c--)
		xs = xs*10;//小數部分放大10^c倍
	zxs = (int)xs;
	/*if(zxs%10>=5)
	{
		
		printf("%d\n", zxs+1);
	}
	else
	{
		printf("%d\n", zxs);
	}*/
    printf("%d\n",zxs%10>=5 ?zxs+1:zxs);
	return 0;
}

測試了一會就發現我的程式還有問題,在c很大的時候我的小數部分會溢位……待我慢慢考慮……

續前文:想不出來,還是看了別人的解決辦法,通過小學學的數學除法運算來實現的,真的容易被忽略

#include <stdio.h>
#include <math.h>
int main()
{
	int a,b,c,ys;
	double d;
	scanf("%d%d%d",&a,&b,&c);
	d = a*1.0;
	printf("%d.",(int)d/b);//整數部分
	ys = a%b;//餘數
	for(; c > 1 ; c--)//c-1位小數先輸出
	{
		ys *= 10;//餘數放大10倍
		printf("%d", ys/b);//餘數/b
		ys %=b;//再得到一個新的餘數
	}
	ys *= 10;
	printf("%d\n",ys/b>=5? ys/b+1 : ys/b);//最後一位的值為下一位四捨五入
	return 0;
}