题目链接:

思路:
通过数组模拟d的每一位,逐位进行计算,从而实现对d的精确处理。
代码:
cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2020;
int n;
string s;
vector<int> q;
void gd(vector<int>& q, int num){
int t = 0;
for(int i = 0; i < (int)q.size(); i++){
//计算每一位乘 num
t += q[i] * num;
//余数
q[i] = t % 10;
//进位
t /= 10;
}
//进位
if(t) q.push_back(t);
}
void add(vector<int>& q, int k, int num){
//t=num 表示后面一位要加上前面一位 / 10 的数(进位)
int t = num;
for(int i = k; i < (int)q.size(); i++){
t += q[i];
q[i] = t % 10;
t /= 10;
}
if(t) q.push_back(t);
}
signed main(){
cin >> n >> s;
//反转s
reverse(s.begin(), s.end());
//得到s反转后小数点的位置
int c = s.find('.');
//将反转的s存入q中
for(auto x: s){
if(x !='.'){
//将x转换为int类型
q.push_back(x - '0');
}
}
//高精度 * 低精度
while(n--) gd(q, 2);
//四舍五入
//反转后判断小数点前面位置
//q中没有存'.',所以小数点位置就是进位的位置
if(q[c-1] >= 5) add(q,c,1);
//输出整数答案 逆序
for(int i = (int)q.size()-1; i >= c; i--){
cout << q[i];
}
return 0;
}