題意:
求A+B,A-B;
-10^5<=A,B<=10^5;
題解:
沒啥可說的。。。自用模闆而已;
感覺實作注意傳參要傳位址否則結構體太大會RE的;
同号可以直接處理,異号加變減減變加,就轉化成同号咯;
上代碼;
代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define mod 10
using namespace std;
char str[N];
struct BIG
{
bool sign;
int len;
int num[N];
void read()
{
scanf("%s",str);
len=strlen(str);
int i;
if(str[0]=='-') sign=0,i=1;
else sign=1,i=0;
for(;i<len;i++)
num[len-i]=str[i]-'0';
return ;
}
void print()
{
if(!sign)
printf("-");
for(int i=len;i>0;i--)
printf("%d",num[i]);
printf("\n");
}
}a,b,In;
bool operator<(BIG &a,BIG &b)
{
if(a.sign^b.sign)
return !a.sign;
if(a.len!=b.len)
return (a.len>b.len)^a.sign;
for(int i=a.len;i>0;i--)
if(a.num[i]<b.num[i])
return a.sign;
return 0;
}
BIG operator-(BIG &a,BIG &b);
BIG operator+(BIG &a,BIG &b)
{
if(a.sign^b.sign)
{
b.sign^=1;
return a-b;
}
BIG ret=In;
int up=0,len=max(a.len,b.len),temp;
for(int i=1;i<=len;i++)
{
temp=a.num[i]+b.num[i]+up;
ret.num[i]=temp>=mod?temp-mod:temp;
up=(temp>=mod);
}
ret.sign=a.sign;
if(up) ret.num[len+1]=1,ret.len=len+1;
else ret.len=len;
while(ret.num[ret.len]==0&&ret.len>1)
ret.len--;
return ret;
}
BIG operator-(BIG &a,BIG &b)
{
if(a.sign^b.sign)
{
b.sign^=1;
return a+b;
}
if(!(a<b^a.sign))
{
a.sign^=1,b.sign^=1;
swap(a,b);
}
BIG ret=In;
int up=0,len=max(a.len,b.len),temp;
for(int i=1;i<=len;i++)
{
temp=a.num[i]-b.num[i]-up;
ret.num[i]=temp<0?temp+mod:temp;
up=temp<0;
}
ret.sign=a.sign,ret.len=len;
while(ret.num[ret.len]==0&&ret.len>1)
ret.len--;
return ret;
}
int main()
{
a.read();
b.read();
(a+b).print();
(a-b).print();
return 0;
}