欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法入门练习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;
}