R格式
#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
string sofd;
int pt,pp,pd,n;
int t[N], p[N],sav[N],d[N];
void c1() {
memset(sav, 0, sizeof(sav));//目标数组,目的值,目标数组大小
for(int i=0;i<pt;i++)
for (int j = 0; j < pp; j++) {
sav[i + j] += t[i] * p[j];
sav[i + j + 1] += sav[i + j] / 10;
sav[i + j] %= 10;
}
int len = pt+pp+1;//将len设置大一点
while (sav[len-1] == 0 && len > 1)//从数组从0开始,所以这里判断的是len-1
len--;
pt = len;
memcpy(t, sav, sizeof(sav));//目标数组,被复制数组,被复制数组大小
}
void c2() {
memset(sav, 0, sizeof(sav));
for (int i = 0; i < pp; i++)
for (int j = 0; j < pp; j++) {
sav[i + j] += p[i] * p[j];
sav[i + j + 1] += sav[i + j] / 10;
sav[i + j] %= 10;
}
int len = pp + pp + 1;
while (sav[len-1] == 0 && len > 1)
len--;
pp = len;
memcpy(p, sav, sizeof(sav));
}
void c3() {
memset(sav, 0, sizeof(sav));
for (int i = 0; i < pt; i++)
for (int j = 0; j<pd; j++) {
sav[i + j] += t[i] * d[j];
sav[i + j + 1] += sav[i + j] / 10;
sav[i + j] %= 10;
}
int len = pt + pd + 1;
while (sav[len - 1] == 0 && len > 1)
len--;
pd = len;
memcpy(d, sav, sizeof(sav));
}
int main() {
cin >> n;
cin >> sofd;
pd = sofd.size();
t[0] = 1;//求pow(2,n),t[0]=1,p[0]=2
pt = 1, pp = 1;
p[0] = 2;
while (n) {
if (n & 1)
c1();//t*=p
n = n >> 1;
c2();//p*=p
}
int pos = 0;
for(int i = pd - 1; i >= 0; i--) {
if (sofd[i] == '.') {
pos = pd-1-i;//小数点后几位
break;
}
}
pd = 0;
for (int i = sofd.size()-1; i >=0 ; i--) {
if (sofd[i] == '.') {
continue;
}
d[pd] = sofd[i] - '0';
pd++;
}
c3();//t*sofd
/*for (int i = pt - 1; i >= 0; i--)
printf("%d", t[i]);*/
for (int i = pd - 1; i >= 0; i--) {
if (i == pd - pos - 1)
;
//printf("%d", d[i]);
}
for (int i = 0; i <pd; i++) {
if (i < pos) {
if (d[i] >= 5) {
d[i + 1] += 1;
d[i] = 0;
}
}
else
break;
}
for (int i = pd-1; i >=0; i--) {
if (i >= pos) {
printf("%d", d[i]);
}
}
}