P1601老师2019全对我两个AC三个WA
查看原帖
P1601老师2019全对我两个AC三个WA
738761
HappyDavid楼主2022/8/11 10:54

测试点1AC2WA3WA4AC4WA

#include <bits/stdc++.h>
using namespace std;

//高精度大数
struct hugeint{
	long long num[10100]={0};//倒序存储具体的数字
	int len=0;//数字的长度
	string s="";
};
//将字符串转成数字 	"1234"    4321
hugeint strtoint(string s){
	hugeint ans;
	for(int i=s.size()-1;i>=0;i--){
		ans.num[++ans.len]=s[i]-'0';
	}
	return ans;
}
//打印高精度大数
void printint(hugeint n){
	cout<<n.s;
	for(int i=n.len;i>=1;i--){
		cout<<n.num[i];
	}
	cout<<endl;
}
//比较两个数字大小,如果a>b返回1,如果a<b返回-1,如果a=b返回0
int cmp2(hugeint a,hugeint b){
	//如果数字长度不一样,长的数字比较大
	if(a.len>b.len){
		return 1;
	}
	else if(b.len>a.len){
		return -1;
	}
	else{
		//如果数字长度相同,从高位到低位逐位比较
		for(int i=1;i<=a.len;i++){
			if(a.num[i]>b.num[i]){
				return 1;
			}
			else if(b.num[i]>a.num[i]){
				return -1;
			}
		}
		return 0;
		
	}
}
//处理前导0
hugeint prelead0(hugeint n){
	while(n.num[n.len]==0 && n.len>1){
		n.len--;
	}
	return n;
}
//高精度+高精度
hugeint add(hugeint a,hugeint b){
	hugeint ans;
	ans.len=max(a.len,b.len);
	//从低位往高位进行运算
	for(int i=1;i<=ans.len;i++){
		ans.num[i]=a.num[i]+b.num[i];//对应位进行加法运算
		ans.num[i+1]=ans.num[i]/10;//更新进位
		ans.num[i]%=10;//将运算结果的个位保存到ans中
	}
	//处理进位溢出
	if(ans.num[ans.len+1]>0){
		ans.len++;
	}
	return ans;
}
//高精度-高精度
hugeint sub(hugeint a,hugeint b){
	hugeint ans;
	
	//如果a<b,交换它们,标记运算结果
	if(cmp2(a,b)==-1){
		swap(a,b);
		ans.s="-";
	}
	ans.len=a.len;
	//从低位到高位进行运算
	for(int i=1;i<=ans.len;i++){
		ans.num[i]+=a.num[i]-b.num[i];//对应位进行减法运算
		//处理借位
		if(ans.num[i]<0){
			ans.num[i+1]=-1;//更新借位
			ans.num[i]+=10;
		}
	}
	ans=prelead0(ans);//处理前导0
	return ans;
}
//高精度*高精度
hugeint mul(hugeint a,hugeint b){
	hugeint ans;
	ans.len=a.len+b.len-1;
	//从低位往高位进行运算
	for(int i=1;i<=a.len;i++){
		for(int j=1;j<=b.len;j++){
			ans.num[i+j-1]=a.num[i]*b.num[j];//对应位进行乘法运算
			ans.num[i+j]+=ans.num[i+j-1]/10;//更新进位
			ans.num[i+j-1]%=10;//将运算结果的个位保留到ans中
		}
	}
	//处理进位溢出
	if(ans.num[ans.len+1]>0){
		ans.len++;
	}
	ans=prelead0(ans);//处理前导0
	return ans;
}
//高精度/低精度
hugeint div(hugeint a,long long b){
	hugeint ans;
	ans.len=a.len;
	//从高位到低位进行运算
	for(int i=a.len;i>=1;i--){
		ans.num[i]=ans.num[i]/b;//对应位进行除法运算
		a.num[i-1]=a.num[i]%b*10;//处理余数
	}
	ans=prelead0(ans);//处理前导0
	return ans;
}
int plusMAIN(){
	string a,b;
	cin>>a>>b;
	hugeint n1=strtoint(a);
	hugeint n2=strtoint(b);
	
	printint(add(n1,n2));
	return 0;
}
int minusMAIN(){
	string a,b;
	cin>>a>>b;
	hugeint n1=strtoint(a);
	hugeint n2=strtoint(b);
	printint(sub(n1,n2));
	return 0;
}
int timesMAIN(){
	string a,b;
	cin>>a>>b;
	hugeint n1=strtoint(a);
	hugeint n2=strtoint(b);
	printint(mul(n1,n2));
	return 0;
}
int dividedMAIN(){
	string a;
	long long b;
	cin>>a>>b;
	hugeint n1=strtoint(a);
	printint(div(n1,b));
	return 0;
}
/*



*/
int main()
{
    plusMAIN();
    return 0;
}

请问怎么回事?

2022/8/11 10:54
加载中...