昨天学习了一下高精度加减乘除,感觉还不错,顺便还练习了一下重载
参考了一下别人的模板(来源未知)
完整代码如下(只考虑非负数):
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1005;
struct bign
{
int len,s[N];
bign() { memset(s,0,sizeof(s)); len=1; }
bign(int num) { *this=num; }
bign(char *num) { *this=num; }
//赋值
bign operator =(int num)
{
char c[N];
sprintf(c,"%d",num);
*this=c;
return *this;
}
bign operator =(const char *num)
{
len=strlen(num);
for (int i=0;i<len;i++) s[i]=num[len-1-i]-'0';//reverse
return *this;
}
//比大小
bool operator <(const bign &b)
{
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 bign &b)
{
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 bign &b){
return !(*this<b)&&!(*this>b);
}
//转化为string类
string str()
{
string res="";
for (int i=0;i<len;i++) res=(char)(s[i]+'0')+res;//reverse
return res;
}
//清除前导0
void clean()
{
while (len>1&&!s[len-1]) len--;
}
//重载运算符
bign operator +(const bign &b)
{
bign c;
c.len=0;
for (int i=0,g=0;g||i<len||i<b.len;i++)
{
int x=g;
if (i<len) x+=s[i];
if (i<b.len) x+=b.s[i];
c.s[c.len++]=x%10;
g=x/10;
}
return c;
}
bign operator +=(const bign &b)
{
*this=*this+b;
return *this;
}
bign operator -(const bign &b)
{
bign c;
c.len=0;
int x;
for (int i=0,g=0;i<len;i++)
{
x=s[i]-g;
if (i<b.len) x-=b.s[i];
if (x>=0) g=0;
else{
x+=10;
g=1;
};
c.s[c.len++]=x;
}
c.clean();
return c;
}
bign operator -=(const bign &b)
{
*this=*this-b;
return *this;
}
bign operator *(const bign &b)
{
bign 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;
}
bign operator *=(const bign &b){
*this=*this*b;
return *this;
}
/*
bign operator /(const int &b){//低精度除法
bign c;
int f=0;
for(int i=len-1;i>=0;i--){
f*=10;
f+=s[i];
c.s[i]=f/b;
f%=b;
}
c.len=len;
c.clean();
return c;
}
*/
bign operator /(const bign &b){//高精度除法
bign c,f=0;
for(int i=len-1;i>=0;i--){
f*=10;
f+=s[i];
while(f>b || f==b){
f-=b;
c.s[i]++;
}
}
c.len=len;
c.clean();
return c;
}
bign operator /=(const bign &b){
*this=*this/b;
return *this;
}
};
istream& operator >>(istream &in,bign &x)
{
string s;
in>>s;
x=s.c_str();
return in;
}
ostream& operator <<(ostream &out,bign &x)
{
out<<x.str();
return out;
}
int main(){
bign a,b,c;
ios::sync_with_stdio(false);
cin>>a>>b;
// cout<<a<<endl;
// cout<<b<<endl;
c=a/b;
cout<<c<<endl;
return 0;
}
这样定义bign后便可以像基本类型一样用了。