专栏文章
free 高精乘、加、减
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minyrz4t
- 此快照首次捕获于
- 2025/12/02 10:33 3 个月前
- 此快照最后确认于
- 2025/12/02 10:33 3 个月前
CPP
class Bigint{
public:
int a[105];
Bigint()
{
memset(a,0,sizeof(a));
a[0]=1;
}
friend ostream & operator << (ostream &o,const Bigint &b);
friend istream & operator >> (istream &in,Bigint &b);
Bigint operator + (Bigint r)
{
Bigint c;
c.a[0]=max(a[0],r.a[0]);
for(int i=1;i<=c.a[0];i++)
{
c.a[i]+=a[i]+r.a[i];
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
if(c.a[c.a[0]+1])
c.a[0]++;
while(c.a[c.a[0]]==0&&c.a[0]>=2)
c.a[0]--;
return c;
}
Bigint operator - (Bigint r)
{
Bigint c;
c.a[0]=max(a[0],r.a[0]);
for(int i=1;i<=c.a[0];i++)
{
c.a[i]+=a[i]-r.a[i];
if(c.a[i]<0)
{
c.a[i]+=10;
c.a[i+1]--;
}
}
while(c.a[c.a[0]]==0&&c.a[0]>=2)
c.a[0]--;
return c;
}
Bigint operator * (Bigint r)
{
Bigint c;
c.a[0]=a[0]+r.a[0];
for(int i=1;i<=a[0];i++)
for(int j=1;j<=r.a[0];j++)
{
c.a[i+j-1]+=a[i]*r.a[j];
}
for(int i=1;i<=c.a[0];i++)
{
c.a[i+1]+=c.a[i]/10;
c.a[i]%=10;
}
while(c.a[c.a[0]]==0&&c.a[0]>=2)
c.a[0]--;
return c;
}
bool operator < (Bigint r)
{
if(a[0]!=r.a[0])
return a[0]<r.a[0];
for(int i=a[0];i>=1;i--)
if(a[i]!=r.a[i])
return a[i]<r.a[i];
return false;
}
bool operator > (Bigint r)
{
if(a[0]!=r.a[0])
return a[0]>r.a[0];
for(int i=a[0];i>=1;i--)
if(a[i]!=r.a[i])
return a[i]>r.a[i];
return false;
}
bool operator <= (Bigint r)
{
if(a[0]!=r.a[0])
return a[0]<=r.a[0];
for(int i=a[0];i>=1;i--)
if(a[i]!=r.a[i])
return a[i]<=r.a[i];
return true;
}
bool operator >= (Bigint r)
{
if(a[0]!=r.a[0])
return a[0]>=r.a[0];
for(int i=a[0];i>=1;i--)
if(a[i]!=r.a[i])
return a[i]>=r.a[i];
return true;
}
Bigint operator / (Bigint r)
{
Bigint c;
c.a[0]=a[0]-r.a[0]+1;
for(int i=c.a[0];i>=1;i--)
{
int x=0;
while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])
x++;
c.a[i]=x;
for(int j=r.a[0];j>=1;j--)
a[i+x-1+j]-=r.a[j]*x;
}
while(c.a[c.a[0]]==0&&c.a[0]>=2)
c.a[0]--;
return c;
}
Bigint operator % (Bigint r)
{
Bigint c;
c.a[0]=a[0]-r.a[0]+1;
for(int i=c.a[0];i>=1;i--)
{
int x=0;
while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])
x++;
c.a[i]=x;
for(int j=r.a[0];j>=1;j--)
a[i+x-1+j]-=r.a[j]*x;
}
while(c.a[c.a[0]]==0&&c.a[0]>=2)
c.a[0]--;
return c;
}
};
istream & operator >> (istream &in,Bigint &b)
{
string s;
in>>s;
b.a[0]=s.size();
for(size_t i=0;i<s.size();i++)
b.a[i+1]=s[s.size()-1-i]-'0';
return in;
}
ostream & operator << (ostream &o,const Bigint &b)
{
for(int i=b.a[0];i>=1;i--)
o<<b.a[i];
return o;
}
Bigint int_to_bigint(int num)
{
Bigint res;
if(num==0)
{
res.a[0]=1;
res.a[1]=0;
return res;
}
if(num<0)
{
num=-num;
}
int len=0;
while(num>0)
{
res.a[++len]=num%10;
num/=10;
}
res.a[0]=len;
return res;
}
压行后的:
CPPclass Bigint{public: int a[105]; Bigint(){memset(a,0,sizeof(a));a[0]=1;} friend ostream & operator << (ostream &o,const Bigint &b); friend istream & operator >> (istream &in,Bigint &b); Bigint operator + (Bigint r){Bigint c;c.a[0]=max(a[0],r.a[0]);for(int i=1;i<=c.a[0];i++){c.a[i]+=a[i]+r.a[i];c.a[i+1]+=c.a[i]/10;c.a[i]%=10;}if(c.a[c.a[0]+1])c.a[0]++;while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator - (Bigint r){Bigint c;c.a[0]=max(a[0],r.a[0]);for(int i=1;i<=c.a[0];i++){c.a[i]+=a[i]-r.a[i];if(c.a[i]<0){c.a[i]+=10;c.a[i+1]--;}}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator * (Bigint r){Bigint c;c.a[0]=a[0]+r.a[0];for(int i=1;i<=a[0];i++)for(int j=1;j<=r.a[0];j++){c.a[i+j-1]+=a[i]*r.a[j];}for(int i=1;i<=c.a[0];i++){c.a[i+1]+=c.a[i]/10;c.a[i]%=10;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} bool operator < (Bigint r){if(a[0]!=r.a[0])return a[0]<r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]<r.a[i];return false;} bool operator > (Bigint r){if(a[0]!=r.a[0])return a[0]>r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]>r.a[i];return false;} bool operator <= (Bigint r){if(a[0]!=r.a[0])return a[0]<=r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]<=r.a[i];return true;} bool operator >= (Bigint r){if(a[0]!=r.a[0])return a[0]>=r.a[0];for(int i=a[0];i>=1;i--)if(a[i]!=r.a[i])return a[i]>=r.a[i];return true;} Bigint operator / (Bigint r){Bigint c;c.a[0]=a[0]-r.a[0]+1;for(int i=c.a[0];i>=1;i--){int x=0;while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])x++;c.a[i]=x;for(int j=r.a[0];j>=1;j--)a[i+x-1+j]-=r.a[j]*x;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;} Bigint operator % (Bigint r){Bigint c;c.a[0]=a[0]-r.a[0]+1;for(int i=c.a[0];i>=1;i--){int x=0;while(a[i+x]*10+r.a[r.a[0]]<=a[i+x-1]*10+r.a[r.a[0]-1])x++;c.a[i]=x;for(int j=r.a[0];j>=1;j--)a[i+x-1+j]-=r.a[j]*x;}while(c.a[c.a[0]]==0&&c.a[0]>=2)c.a[0]--;return c;}}; istream & operator >> (istream &in,Bigint &b){string s;in>>s;b.a[0]=s.size();for(size_t i=0;i<s.size();i++)b.a[i+1]=s[s.size()-1-i]-'0';return in;} ostream & operator << (ostream &o,const Bigint &b){for(int i=b.a[0];i>=1;i--)o<<b.a[i];return o;} Bigint int_to_bigint(int num){Bigint res;if(num==0){res.a[0]=1;res.a[1]=0;return res;}if(num<0){num=-num;}int len=0;while(num>0){res.a[++len]=num%10;num/=10;}res.a[0]=len;return res;}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...