习题2-5 分数化小数(decimal)

时间:2021-12-11 00:14:34

输入正整数a, b, c,输出a/b的小数形式,精确到小数点后c位。a, b <= 10^6,c <= 100。输入包含多组数据,结束标记为a=b=c=0.  

样例输入:

16 4

00 0

样例输出:

Case 1:0.1667

//version 1 未考虑double型数据的有效数字只有15-16位
#include <stdio.h>
int main()
{
int a,b,c,count=1;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
if(a==0&&b==0&&c==0)
break;
printf("Case %d:%.*lf\n",count++,c,(double)(a)/b);
//printf("%*.*lf", x, y, z);
//意思是输出带宽为x,小数点后y为的double型数据z
}
return 0;
}

可用 1 6 58 测试。

//version 2 未考虑小数部分第c位是9,即四舍五入后还需进位
#include <stdio.h>
int main()
{
int a,b,c,tmp,count=1;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
if(a==0&&b==0&&c==0)
break;
printf("Case %d:%d.",count++,a/b);//整数部分
a=a%b*10;
while(c-->1){//小数点后前c-1位
printf("%d",a/b);
a=a%b*10;
}
tmp=a%b*10/b;//tmp是初始a/b的小数点后第c+1位数字
if(tmp<5)
printf("%d\n",a/b);
else
printf("%d\n",a/b+1);
}
return 0;
}


可用【3930 1687 4】、【3930 1687 3】测试。


//version 3
#include <stdio.h>
int main()
{
int a,b,c,tmp,i,t,count=1;;
int s[110];//用于保存小数点后的部分
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
if(a==0&&b==0&&c==0)
break;
t=a/b;
a=a%b*10;
for(i=1;i<c;i++){//小数点后前c-1位保存到数组s中
s[i]=a/b;
a=a%b*10;
}
tmp=a%b*10/b;//tmp是初始a/b的小数点后第c+1位数字
if(tmp<5)
s[i]=a/b;//s[i]即s[c]
else
s[i]=a/b+1;
while(i>1){
if(s[i]==10){
s[i]-=10;
s[i-1]+=1;
}
i--;
}
if(s[1]==10){
s[1]-=10;
t++;
}
printf("Case %d:%d.",count++,t);
for(i=1;i<=c;i++)
printf("%d",s[i]);
printf("\n");
}
return 0;
}