来自紫书的习题2-5分数化小数

题面是:

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

本题需要考虑的是若小数点超过了double的16位该怎么办

根据除法可以得知,小数点的每一位都是商,不过是放大后再被除数相除而已

故我们可以这么办:

拿a=1,b=6为例

1/6的第一个结果是1/6 = 0...1

我们可以知道1/6是得不到整数位的商

故其可以从其小数位开始,每一位都所得余数皆*10作为下一位的被除数,直至余数为0

代码如下:

#include<stdio.h>
int g = 1;
int main()
{
	int a, b, c;
	while(scanf("%d %d %d", &a, &b, &c) != 	EOF){
		if(a == 0 && b == 0 && c == 0)
			break; 
		int t = 0;
		printf("Case %d: %d.", g++, a / b); 
		while(t++ <= c){
			a = a % b * 10;
			
			printf("%d", a / b);
		}
		printf("\n");
	}
	return 0;
}

总感觉哪里怪怪的,如果有大佬能看出来哪里有错,欢迎指教