算法入门练习No.9:分数化小数(decimal)
程序员文章站
2024-03-18 23:17:16
...
输入正整数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;
}