算法入门练习No.9:分数化小数(decimal)

输入正整数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;
}

 

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd3dda12b717778ac20fa0c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞