演算法入門練習No.9:分數化小數(decimal)
阿新 • • 發佈:2019-01-28
輸入正整數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; }