您的位置:首页 > 其它

【给将来学神的算法详解--高精】(1)(我的)高精度模板

2016-09-07 19:14 260 查看
这是关于高精度的所有文章的开头。。。

————————————华丽的分割线————————————

声明:这里只贴代码,并不解释,详解将在后来的文章给出。。。

本代码用了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;}


————————————华丽的分割线————————————

然后呢

然后就没了啊~~~

请期待下一篇文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: