【求助】数据全过,然而全WA
查看原帖
【求助】数据全过,然而全WA
393852
C83_AD楼主2024/5/15 17:15

如题。我用重载运算符的方式来实现加减法运算。

每个测试点答案都能过,然而拿不到分。用的是洛谷的云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; 
}
2024/5/15 17:15
加载中...