输入:
正整数a,b,c(a,b<=100000,c<=1000),输入有多组测试用例结束的标志为a=b=c=0。
输出:
a/b的小数形式,精确到小数点后c位。
样例输入:
1 6 4
0 0 0
样例输出:
0.1667
解题思路一:
这是一种投机取巧的方法,当然只能通过一部分数据,就是格式化输出printf的特殊用法,这个方法比分别求小数部分和整数部分以及处理进位问题要容易的多,但是测试时发现一旦c大于16以后,输出的浮点数后面全为0,原因是double的有效精度只有16位。所以不适合题意。感兴趣的可以看一下代码:↓↓↓
#include<stdio.h>
int main()
{
int a,b,c;
double m;
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
if(a==0&&b==0&&c==0)
break;
m=1.0*a/b;
printf("%.*lf",c,m);
}
return 0;
}
解题思路二:
好了,我们回归正规思想,就是分别算两数相除的整数部分和小数部分,然后再处理进位问题。这里选择题目的样例就是1/6,输出小数点后4位数,先求出他们的商,既1÷6=0······1。商为0,余数为1。那么此时就打印出”0.”来。接着应该算十分位,所以余数1应该乘以10为10,保持被除数和除数位数一致。10÷6=1······4。商为1,余数为4。此时打印出来“1”来。则输出的为“0.1”。再算百分位:40÷6=6······4,商为6,余数为4。此时打印出“6”。输出界面输出“0.16”。以上办法得出千分位和万分位。输出界面输出结果为“0.1666”。此时就有四位小数,但是还要检查最后一位是否为四舍五入。再次计算十万分位,发现商为6,那么万分位就要进一。最后结果为“0.1667”。代码如下:↓↓↓
#include<stdio.h>
int n,m[110];
int main()
{
int i,a,b,c;
double x;
while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
if(a==0&&b==0&&c==0)
break;
n=a/b;
a=a%b;
m[0]=0;
for(i=1;i<=c;i++)
{
m[i]=a*10/b;
a=a*10%b;
}
if(a*10/b>=5)
{
for(i=c;i>=0;i--)
{
m[i]++;
if(m[i]<10)
break;
else
m[i]-=10;
}
}
n=n+m[0];
printf("%d.",n);
for(i=1;i<=c;i++)
printf("%d",m[i]);
printf("\n");
}
return 0;
}
来源:CSDN
作者:Forever+Young
链接:https://blog.csdn.net/weixin_43823808/article/details/103533532