分数化小数c语言题目,习题 2-5 分数化小数 (decimal)(C语言版)

习题描述:“输入正整数 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

感悟://这道题有些小插曲,我之前尝试了一些,由于基础不是很扎实,想的比较复杂,后来了解到:格式化输出(printf)的特殊用法。如printf(“% * . * lf\n”, 8, 4, (double)1/6); 会输出8个字宽保留4位小数的浮点数运算结果。

这个方法比分别求小数的整数部分和小数部分 且还要考虑进位的情况简易的多。但是测试时发现一旦c大于16以后,输出的浮点数后面全为0,原因是double的有效精度只有16位。不适合题意,但是我还是把两种方法给列了出来。

解法一(printf的特殊用法)(不符合题意要求):

#include

int main()

{

int a,b,c,s=0;

double m;

while(scanf("%d%d%d",&a,&b,&c)!=EOF)

{

if(a==0&&b==0&&c==0)

{

break;

}

m=1.0*a/b;

s++;

printf("Case %d: %.*f",s,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

int n,m[110];//n整数部分,m小数部分

int main()

{

int a,b,c,i,k=0;

while(scanf("%d%d%d",&a,&b,&c)&&a&&b&&c)

{

k++;

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)//第C+1位,四舍五入

{

for(i=c;i>=0;i--)//进位处理

{

m[i]=m[i]+1;

if(m[i]<10)

break;//若不存在进位,跳出循环。

else

m[i]-=10;

}

}

n=n+m[0];//整数部分进位处理。

printf("Case %d: %d.",k,n);//打印整数部分及小数点

for(i=1;i<=c;i++)

printf("%d",m[i]);//打印小数部分。

printf("\n");

}

return 0;

}

欢迎指点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值