题目描述:
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位,a,b<=10^6,c<=100
以三个0结束输入。
分析:
开始想用C++的setprecision(x),后来一想,setprecision只能到小数点后16位(double的精确度范围),因此需要手动模拟除法过程。很简单,只需要先算出小数点前的数输出,求得余数。对于小数点后的数:先对余数乘以10,除以b并输出,再用取得的余数作为除数迭代即可。
由于最后一位的下一位需要四舍五入,因此将循环设定为1到n-1,再计算n+1位即可。
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<Windows.h>
#include<cmath>
using namespace std;
int main()
{
int a, b, c, t1, t2; //t1代表整数部分,t2代表小数部分
int cnt = 1;
while (scanf("%d%d%d", &a, &b, &c) == 3)
{
if (a == b && b == c) break;
cout << "Case " << cnt++ << ": ";
t1 = a / b;
t2 = a - t1;
cout << t1 << ".";
for (int i = 1;i <= c-1;i++)
{
t2 *= 10;
cout << t2 / b;
t2 %= b;
}
t1 = ((t2 * 10 % b) * 10) / b;
if (t1 >= 5) cout << t2 * 10 / b + 1;
else cout << t2 * 10 / b;
cout << endl;
}
system("pause");
return 0;
}