【算法详解-高精】(1)(我的)高精度模板

这是关于高精度的所有文章的开头。。。
————————————华丽的分割线————————————
声明:这里只贴代码,并不解释,详解将在后来的文章给出。。。
本代码用了operator重定义,不会的就看其他的文章吧。。。
以后的文章代码将不会给出,要代码来这里
代码:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=0;i<=n;i++)
using namespace std;

const int maxn=20001;
struct bignum
{
	int len,s[maxn];
	bignum(){memset(s,0,sizeof(s)),len=1;}
	bignum(int num){*this=num;}
	bignum(const char* num){*this=num;}
	bool operator<(const bignum&b)const
	{
		if(len!=b.len)return len<b.len;
		for(int i=len-1;i>=0;i--)
    		if(s[i]!=b.s[i])return s[i]<b.s[i];
    	return false;
  	}
	bool operator>(const bignum&b)const{return b<*this;}
	bool operator>=(const bignum&b){return !(*this<b);}
  	bool operator<=(const bignum&b){return !(b>*this);}
  	bool operator==(const bignum&b){return !(b<*this)&&!(*this<b);}
	bignum operator=(int num)
	{
		char s[maxn];
		sprintf(s,"%d",num);
    	*this=s;
    	return *this;
	}
	void clean(){while(len>1&&!s[len-1])len--;}
	bignum operator=(const char*num)
	{
    	len=strlen(num);
    	for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
    	return *this;
	}
	bignum operator+(const bignum&a)
	{
		bignum c;
		c.len=max(len,a.len)+1;
		for(int i=0,x=0;i<c.len;++i)
		{
			c.s[i]=s[i]+a.s[i]+x;
			x=c.s[i]/10;
			c.s[i]=c.s[i]%10;
		}
		if(c.s[c.len-1]==0)--c.len;
		return c;	
	}
	bignum operator+=(const bignum&b){*this=*this+b;return *this;}
	bignum operator*(const bignum&b) 
	{
    	bignum c;
		c.len=len+b.len;
    	for(int i=0;i<len;i++)
    		for(int j=0;j<b.len;j++)
				c.s[i+j]+=s[i]*b.s[j];
    	for(int i=0;i<c.len-1;i++)
		{
    		c.s[i+1]+=c.s[i]/10;
    		c.s[i]%=10;
    	}
    	c.clean();
    	return c;
	}
	bignum operator*=(const bignum&b){*this=*this*b;return *this;}	
	bignum operator-(const bignum&b) 
	{
		bignum c;c.len=0;
		for(int i=0,g=0;i<len;i++)
		{
			int x=s[i]-g;
    		if(i<b.len)x-=b.s[i];
    		x>=0?g=0:(g=1,x+=10);
      		c.s[c.len++]=x;
    	}
    c.clean();
    return c;
	}
	bignum operator-=(const bignum&b){*this=*this-b;return *this;}
	bignum operator/(const bignum&b) 
	{
		bignum a=*this,c,b_;
		ri cnt,i,j,he;
		c.len=0;
		if(*this<b)c=0;
		else
		{
			for(i=b_.len=a.len,i--,j=b.len-1;j>=0;j--,i--)b_.s[i]=b.s[j];
			while(a<b_)for(b_.len--,i=1;i<=b_.len;i++)b_.s[i-1]=b_.s[i];b_.s[b_.len]=0;
			while(1)
			{
				cnt=0;
				while(a>=b_)a-=b_,cnt++;
				c.s[c.len++]=cnt;
				if(b_==b)break;
				for(b_.len--,i=1;i<=b_.len;i++)b_.s[i-1]=b_.s[i];b_.s[b_.len]=0;
			}
			for(i=0,j=c.len-1;i<j;i++,j--)he=c.s[i],c.s[i]=c.s[j],c.s[j]=he;
		}
		return c;
	}
	bignum operator/(ci&b){bignum a=b;return *this/a;}
	bignum operator%(const bignum&b){return *this-(*this/b*b);}
	bignum operator%(ci&a){bignum b=a;return *this-(*this/b*b);}
	bignum operator/=(const bignum&b){*this=*this/b;return *this;}
	bignum operator%=(const bignum&b){*this=*this%b;return *this;}	
};
istream&operator>>(istream &in,bignum&x)
{
	string s;
	in>>s;
	x=s.c_str();
	return in;
}
ostream&operator<<(ostream &out,const bignum&x){for(int i=x.len-1;i>=0;--i)cout<<x.s[i];return out;}

————————————华丽的分割线————————————
然后呢
然后就没了啊~~~
请期待下一篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值