题意(就是$2^n*d$,最后再四舍五入)
对于$2^n*d$,我们可以转换成d乘上n个2,用for循环加高精度*低精度的代码来实现,我们一开始用idx保留一下小数点最开始的位置,然后删除小数点,便于后续运算
对于四舍五入,题目是保留的整数位置,所有我们只需要判断小数点后的第一位是不是>=5,是的话就套高精度+低精度的代码在整数位置+1即可,输出只输出整数部分。
时间复杂度 $O(n*len(d))$
C++ 代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//高精度 * 低精度
void mul(vector<int> &a, int b)
{
int t = 0;
for(int i = 0; i < a.size(); i++)
{
t += a[i] * b;
a[i] = t % 10;
t /= 10;
}
if(t) a.push_back(t);
}
//高精度 + 低精度
void add(vector<int> &a, int idx, int b)
{
int t = b;
for(int i = idx; i < a.size(); i++)
{
t += a[i];
a[i] = t % 10;
t /= 10;
}
if(t) a.push_back(t);
}
int main()
{
ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
string d;
cin >> n >> d;
reverse(d.begin(), d.end());
int idx = d.find('.');
if(idx) d.erase(idx, 1);
vector<int> D;
for(int i = 0; i < d.size(); i++) D.push_back(d[i] - '0');
for(int i = 0; i < n; i++) mul(D, 2);
//因为删除了小数点,所以之前小数点的后一位就是D[idx - 1],
//考虑整数的进位,所以我们用高精度+低精度的加法来实现进位
//从整数位置开始加,所以传一个idx
if(D[idx - 1] >= 5) add(D, idx, 1);
for(int i = D.size() - 1; i >= idx; i--) cout << D[i];
return 0;
}