本题考的是高精度乘法和高精度加法
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> D;
void mul(vector<int> &D, int b)
{
int t=0;
for(int i=0;i<D.size(); i++){
t+=D[i]*b;
D[i]=t%10;
t/=10;
}
if(t) D.push_back(t);
}
void add(vector<int> &D, int dot, int b)
{
int t=b;//t本身就是用来表示进位的
for(int i=dot; i<D.size() ; i++)
{
t+=D[i];
D[i]=t%10;
t/=10;
}
if(t) D.push_back(t);
}
int main()
{
int n;
string m;
cin>>n>>m;
//先逆置字符串
reverse(m.begin(),m.end());
int dot=m.find('.');//find()函数可以找到小数点的位置
//把浮点数导入D,同时去掉小数点
for(auto c :m)
{
//这里全用c来表示m
if(c != '.') D.push_back(c -'0');
}
//高精度乘法
while(n--) mul(D,2);
//因为要四舍五入,所以要进行高精度加法
if(D[dot-1] >= 5) add(D,dot, 1);
//逆序输出D,因为D是倒着存放的,并且输出到整数就可以了
for(int i=D.size()-1; i>=dot;i--) cout<<D[i];
return 0;
}