围棋盘放麦粒

围棋盘放麦粒

只是个高精度加自写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;
}
posted @ 2021-12-30 17:14  qbning  阅读(91)  评论(0编辑  收藏  举报
描述