励志用尽量少的代码做高效的表达。
题目描述:
输入正整数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格式,还是C++格式,都是错的!!!因为根本没办法显示几十位的小数!
因此,本题的核心思路只有这一个:数组存储高精度小数。举例:
输入1 6 4, 首先将1扩大到100000,用100000除6,得到16666.666…要求保留小数点后四位,因此四舍五入后为:1667。输出整数部分与该数即可。
由于可能取到小数点后100位,因此所有数据用数组存储,模拟手算除法。
代码:
#include<bits/stdc++.h> //万能头文件
using namespace std;
int main() {
int a, b, c, num = 0; //num做计数器
while(cin >> a >> b >> c && a != 0) {
a = (a%b); //保证分子小于分母
int a1[c+2]; //定义被除数数组
memset(a1, 0, sizeof(a1)); a1[0] = a; //置0
int b1[c+1]; memset(b1, 0, sizeof(b1)); //定义存放结果的数组,置0
for(int i = 0; i <= c; i++) { //核心代码
b1[i] = a1[i]*10/b;
a1[i+1] = ((a1[i]*10)%b);
}
if(c>=1) //四舍五入
if(b1[c]>=5) b1[c-1]+=1;
cout << "Case " << ++num << ": " << a/b << '.'; //输出
for(int i = 0; i < c; i++) cout << b1[i];
cout << endl;
}
return 0;
}