分数化小数(decimal)
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≦10^6,c≦100。输入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a,b,c;
int kcase=1;
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
if(!a&&!b&&!c)
break;
printf("Case %d: %d.",kcase++,a/b);//输出小数点之前的部分外加小数点
for(int i=1;i<=c-1;i++)//输出小数点之后的c-1位
{
a%=b;
a*=10;
printf("%d",a/b);
}
int k=((a%b*10)%b*10)/b;//判断第c+1位是否大于等于5
if(k>=5)
printf("%d\n",(a%b*10)/b+1);//输出第c位
else
printf("%d\n",(a%b*10)/b);
}
return 0;
}
注意c的取值范围为小于等于100,而double类型的有效位数只有15或16位,当c大于16时输出的浮点数后面的小数位数全为0,所以只能采用下面的方式手动模拟除法的运算。
该题目的难度在于在不断取余、取整之间理清思路,分三部分进行输出:
1.输出小数点之前的部分外加小数点,这里就可以直接取整;
2.输出小数点后的c-1位,采用for循环进行取余取整操作;
3.通过判断第c+1位是否大于等于5,输出第c位