输入正整数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
这个题要考虑的情况也不少,我觉得还是有点复杂的。求解过程就是模拟除法运算列竖式的那种过程。但是,小数点后要计算c+1位,四舍五入时用。
然后就是四舍五入问题,小数点后第c+1位是9的情况比较特殊,更特殊的就是第c位、c-1位、c-2位都是9,整数部分最后一位也是9,甚至是999.999这种,最高位就要补个1,其他的都变为0,所以,要把结果的第0位空出来(我的结果用数组表示的)。然后大概就是这些吧。感觉没什么问题了。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
int sky = 0;
while (1)
{
sky++;
int b, c;
char ans[128], a[16];
memset(ans, '\0', sizeof(ans));
memset(a, '\0', sizeof(a));
cin >> a >> b >> c;
if (a[0] == '0'&&b == 0 && c == 0)
break;
if (b == 0)
{
printf("error\n");
continue;
}
int temp = 0, pos = 1;
ans[0] = '0';
for (int i = 0; a[i] != '\0'; i++)
{
temp = temp * 10 + a[i] - '0';
ans[pos++] = temp / b + '0';
temp = temp%b;
}
ans[pos++] = '.';
for (int i = 0; i <= c; i++)
{
temp *= 10;
ans[pos++] = temp / b + '0';
temp %= b;
}
// char ans[128] = "0099.999999999";
// int pos = 12;
/* for (int t = pos - 1; t >= 0; t--)
//错误的四舍五入处理
{
if (ans[t] <= '4') break;
if (t == 0) head = 1;
if (ans[t - 1] == '.') t--;
ans[t - 1]++;
ans[t--];
}
*/
int t = pos - 1;
// printf("未四舍五入前 ans is %s\n", ans);
// printf("pos is %d t is %d\n", pos, t);
if (ans[t] - '0' <= 4)
{
ans[t] = '\0';
}
else if (ans[t - 1] <= '8')
{
ans[t - 1]++;
ans[t] = '\0';
}
else
{
ans[t] = '\0';
for (int i = t - 1; i >= 0; i--)
{
ans[i] = '0';
if (ans[i - 1] == '.')
{
i--;
if (ans[i - 1] - '0' >= 0 && ans[i - 1] - '0' <= 8)
{
ans[i - 1]++;
break;
}
/*if (ans[i - 2] - '0' >= 0 && ans[i - 2] - '0' <= 8)
{//被上面的替换掉了,感觉上面那个没问题
ans[i - 2]++;
break;
}*/
}
else if (ans[i - 1] - '0' >= 0 && ans[i - 1] - '0' <= 8)
{
ans[i - 1]++;
break;
}
}
}
// printf("表达式 %s\n", ans);
int findzero;
for (findzero = 0; findzero < 128 && ans[findzero + 1] != '.'&&ans[findzero] == '0'; findzero++);
/* bool f1, f2, f3;
for (findzero = 0;; findzero++)
{
f1 = (findzero < 128);
f2 = (ans[findzero + 1] != '.');
f3 = (ans[findzero] == 0);
if (f1 == 0 || f2 == 0 || f3 == 0)
break;
}
//findzero的详细情况
printf("f1 %d f2 %d f3 %d\n", f1, f2, f3);
*/
// printf("findzero is %d\n", findzero);
// printf("%c\n", ans[findzero]);
printf("Case %d: ", sky);
for (int i = findzero; ans[i] != '\0'; i++)
{
cout << ans[i];
}
cout << endl;
}
// system("pause");
return 0;
}