如题。我用重载运算符的方式来实现加减法运算。
每个测试点答案都能过,然而拿不到分。用的是洛谷的云ide。我想知道这是什么原因?比赛时我的解法是否可用?
注:此段代码可以通过洛谷的高精度加法模板P1601
//重载运算符实现的高精度加减法
#include<stdio.h>
#include<string.h>
#define max(a,b) b<a?a:b
#define min(a,b) a<b?a:b
using namespace std;
struct lnt{//高精度变量
char num[1003];//绝对值(无无效前导0)
int len;//绝对值长度
bool is_negative;//标记是负数
//定义输入输出宏
#define getlnt(a) {\
char ccc=getchar();\
if(ccc=='-') a.is_negative=true;\
else if(ccc!='0') a.num[++a.len]=ccc;\
while((ccc=getchar())!='\n')\
if(a.len||ccc!='0') a.num[++a.len]=ccc;\
if(!a.len) a.num[++a.len]='0';\
}
#define putlnt(a) {\
lnt ccc=a;\
if(ccc.is_negative) putchar('-');\
printf("%s\n",ccc.num+1);\
}
//其他宏
#define clear(a) \
a.is_symbol=a.is_negative=a.len=0,\
memset(a.num,0,sizeof(a.num))
#define resort(a,b) if(a<b){\
lnt ccc=a;a=b,b=ccc;\
}
//重载赋值运算符
lnt operator=(lnt &xx){
this->is_negative=xx.is_negative;
this->is_symbol=xx.is_symbol;
this->len=xx.len;
for(int i=0;i<1003;++i) this->num[i]=xx.num[i];
return xx;
}
//重载对于绝对值的逻辑运算符
bool operator<(lnt &xx){
if(this->len!=xx.len) return this->len<xx.len;
for(int i=1;i<=xx.len;++i)
if(this->num[i]!=xx.num[i]) return this->num[i]<xx.num[i];
return false;
}
bool operator==(lnt &xx){
if(this->len!=xx.len) return false;
for(int i=1;i<=xx.len;++i)
if(this->num[i]!=xx.num[i]) return false;
return true;
}
//重载算数运算符
lnt operator+(lnt &xx){//加法
int a[1003],b[1003],c[1003];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
lnt temp;clear(temp);
if(this->is_negative==xx.is_negative){//同号,绝对值相加,符号不变
temp.len=max(this->len,xx.len);
temp.is_negative=this->is_negative;
for(int i=1;i<=this->len;++i) a[i]=this->num[this->len-i+1]-'0';
for(int i=1;i<=xx.len;++i) b[i]=xx.num[xx.len-i+1]-'0';
for(int i=1;i<=temp.len;++i)
if((c[i]+=a[i]+b[i])>=10) ++c[i+1],c[i]%=10;
if(c[temp.len+1]) ++temp.len;
for(int i=1;i<=temp.len;++i)
temp.num[i]=c[temp.len-i+1]+'0';
return temp;
}
//异号
if(*this==xx){//绝对值等则数值为0
temp.num[++temp.len]='0';
return temp;
}
//否则,用大绝对值减去小绝对值,符号跟绝对值大的
lnt _m=*this,_l=xx;
resort(_m,_l);
temp.is_negative=_m.is_negative;
for(int i=1;i<=_m.len;++i) a[i]=_m.num[_m.len-i+1]-'0';
for(int i=1;i<=_l.len;++i) b[i]=_l.num[_l.len-i+1]-'0';
for(int i=1;i<=_m.len;++i)
if((c[i]+=a[i]-b[i])<0) --c[i+1],c[i]=c[i]+10;
for(int i=_m.len;i>0;--i)
if(temp.len||c[i]!=0) temp.num[++temp.len]=c[i]+'0';
return temp;
}
lnt operator-(lnt &xx){//减一个数就是加上它的相反数
lnt _xx=xx;
_xx.is_negative=!xx.is_negative;
return *this+_xx;
}
}a,b;
int main(){
getlnt(a);
getlnt(b);
putlnt((a-b));
return 0;
}