围棋盘放麦粒
只是个高精度加自写pow
一开始想偷懒,用double ,结果到后面2^52后就无法减1了。。。
貌似是double的精度就到这里,但之后还未溢出。。。。
目前还有些难以理解
不行了,直接自写个高精度吧。。。。
#include<iostream>
#include<cstring>
using namespace std;
struct big_number
{
int n;
int a[100];
big_number()
{
n=1;//0有1位
memset(a,0,sizeof(a));
}
};
typedef big_number b_u;
void print(b_u x)//输出
{
for(int i=x.n;i>=1;i--)
cout<<x.a[i];
}
b_u mul(b_u x,b_u y)//乘法
{
if(x.n<y.n)
swap(x,y);
b_u c;
for(int i=1;i<=y.n;i++)
{
if(y.a[i]==0)continue;
for(int j=1;j<=x.n;j++)
{
if(x.a[j]==0)continue;
c.a[j+i-1]+=x.a[j]*y.a[i];
if(c.a[j+i-1]>9)
{
c.a[j+i]+=c.a[j+i-1]/10;
c.a[j+i-1]%=10;
}
}
}
c.n=x.n+y.n;
while(c.a[c.n]==0&&c.n>1)c.n--;//防止乘完之后为0
return c;
}
b_u sub1(b_u x)//-1
{
int k=0;
while(x.a[++k]-1<0)
{
x.a[k]=9;
}
x.a[k]--;
if(x.a[k]==0&&k==x.n)x.n--;
return x;
}
b_u bpow(int x)//2的快速幂
{
b_u a,b;
a.a[1]=1;
b.a[1]=2;
while(x)
{
if(x&1)
a=mul(a,b);
b=mul(b,b);
x>>=1;
}
return a;
}
int main()
{
int n;
cin>>n;
b_u a,b;
print(sub1(bpow(n)));
return 0;
}
作者:qbning
-------------------------------------------
个性签名:曾经的我们空有一颗望海的心,却从没为前往大海做过真正的努力
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!