重载运算符90分,已给出hack数据求调
查看原帖
重载运算符90分,已给出hack数据求调
90036
buaa_czx楼主2023/1/27 15:04

重载运算符并使用二分,90分,WA两个点。

hack数据:1024 2

并且发现输入1001~1099 2时结果均为549,好像在100000类似的地方也会出现类似的错误,不明白何处出现问题,求大佬调错qwq

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<string>
#include<vector>
using namespace std;
void clear_0(vector<long long>& a) { //清除前导零
	while(a.back()==0&&a.size()>1) {
		a.pop_back();
	}
	return ;
}
void carry(vector<long long>& a) { //进位
	for(int i=0; i<a.size(); i++) {
		if(i==a.size()-1) {
			if(a[i]%10!=0) {
				a.push_back(a[i]/10);
				a[i]%=10;
			}
		} else {
			a[i+1]+=a[i]/10;
			a[i]%=10;
		}
	}
	return;
}
void add(vector<long long>& num,int i,long long a) { //num[i]+=a
	if(i<num.size()) num[i]+=a;
	else {
		num.push_back(a);
	}
	return ;
}
struct bigint {
	vector<long long> num;
	bigint operator=(const long long aa) {//重载赋值运算符=,用long long赋值bigint
		long long a=aa;
		if(a==0) {
			this->num.push_back(0);
		}
		while(a!=0) {
			this->num.push_back(a%10);
			a/=10;
		}
		clear_0(this->num);
		return (*this);
	}
	bigint operator=(const string s) {//重载赋值运算符=,用string赋值bigint
		for(int i=s.length()-1; i>=0; i--) {
			this->num.push_back(s[i]-'0');
		}
		clear_0(this->num);
		return (*this);
	}
	bool operator<(const bigint a)const{
		if(this->num.size()!=a.num.size()) return this->num.size()<a.num.size();
		for(int i=a.num.size()-1;i>=0;i--){
			if(this->num[i]!=a.num[i]) return this->num[i]<a.num[i];
		}
		return false;
	}
	bool operator>(const bigint a)const{
		return a<*this;
	}
	bool operator==(const bigint a)const{
		return !(*this<a)&&!(a<*this);
	}
	bool operator>=(const bigint a)const{
		return *this>a||a==*this;
	}
	bool operator<=(const bigint a)const{
		return *this<a||a==*this;
	}
	bigint operator+(const bigint a) {//高精度加法,bigint+bigint
		bigint ans;
		ans.num.clear();
		int l=max(a.num.size(),this->num.size());
		for(int i=0; i<l; i++) {
			int x,y;
			if(i<a.num.size()) x=a.num[i];
			else x=0;
			if(i<this->num.size()) y=this->num[i];
			else y=0;
			ans.num.push_back(x+y);
		}
		carry(ans.num);
		clear_0(ans.num);
		return ans;
	}
	bigint operator+(const long long aa) {
		bigint a;
		a=aa;
		return a+(*this);
	}
	bigint operator*(const bigint a) { //高精度乘法,bigint*bigint
		bigint ans;ans.num.clear();
		for(int i=0; i<this->num.size(); i++)
			for(int j=0; j<a.num.size(); j++) {
				add(ans.num,i+j,this->num[i]*a.num[j]);
			}
		carry(ans.num);
		clear_0(ans.num);
		return ans;
	}
	bigint operator*(const long long a) { //高精度乘法,bigint*int
		bigint ans;ans.num.clear();
		for(int i=0; i<this->num.size(); i++) {
			add(ans.num,i,a*this->num[i]);
		}
		carry(ans.num);
		clear_0(ans.num);
		return ans;
	}
	bigint operator+=(const bigint a) {
		*this=(*this)+a;
		return (*this);
	}
	bigint operator/(const long long a){
		bigint ans;ans.num.clear();
		long long x=0;
		for(int i=this->num.size()-1;i>=0;i--){
			x=x*10+this->num[i];
			ans.num.push_back(x/a);
			x%=a;
		}
		for(int i=0,j=ans.num.size()-1;i<j;i++,j--){
			swap(ans.num[i],ans.num[j]);
		}
		clear_0(ans.num);
		return ans;
	}
	bigint operator/(bigint a){
		long long l=0,r=1e10,m;
		bigint ans;ans.num.clear();
		while(l<=r){
			bigint m0,m1,m2;
			m=(l+r)/2;m0=m;
			m1=a*m0;m2=m1+a;
			if((m1<=(*this))&&m2>(*this)) break;
			else if(m2<=*this) l=m+1;
			else r=m-1;
		}
		ans=m;
		return ans;
	}
};
istream& operator >> (istream& in,bigint& a) {
	string s;
	in>>s;
	a=s;
	clear_0(a.num);
	return in;
}
ostream& operator<<(ostream& out,bigint& a) {
	clear_0(a.num);
	while((a.num.size()!=0)) {
		out<<a.num.back();
		a.num.pop_back();
	}
	return out;
}
int main() {
	bigint a,c,b;
	cin>>a>>b;
	c=a/b;
	cout<<c;
	return 0;
}
2023/1/27 15:04
加载中...