来自紫书的习题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;
}
总感觉哪里怪怪的,如果有大佬能看出来哪里有错,欢迎指教