求助,玄关
查看原帖
求助,玄关
910440
liujixuan2010118楼主2024/8/20 09:43

报错:terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid

这个报错是什么意思?

(站外题)

https://voj.mobi/contest/294/problem/C

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
string sa,sb,sp;
char op;
struct HPN{
	int a[N];
	HPN(){
		memset(a,0,sizeof(a));
	}
	HPN(string s){
		a[0]=s.length();
		for(int i=1;i<=a[0];i++){
			a[i]=s[a[0]-i]-'0';
		}
	}
	void show(){
		for(int i=a[0];i>=1;i--){
			cout<<a[i];
		}
		cout<<endl;
	}
	void setLen(int i){
		while(a[i]==0&&i>1){
			i--;
		}
		a[0]=i;
	}
	int& operator [] (int i){
		return a[i];
	}
	bool operator >= (HPN b)const{
		if(a[0]>b[0])return 1;
		if(a[0]<b[0])return 0;
		for(int i=a[0];i>=1;i--){
			if(a[i]>b[i])return 1;
			if(a[i]<b[i])return 0;
		}
		return 1;
	}
	HPN operator + (HPN b){
		HPN r;
		int c=0;
		int i;//一定要在外面声明
		for(i=1;i<=max(a[0],b[0]);++i){
			r[i]=a[i]+b[i]+c;
			c=r[i]/10;
			r[i]%=10;
		}
		r[i]=c;
		r.setLen(i);
		return r;
	}
	HPN operator - (HPN b){
		HPN r;
		int c=0;
		for(int i=1;i<=a[0];++i){
			r[i]=a[i]-b[i]-c;
			c=0;
			if(r[i]<0){
				c=1;
				r[i]+=10;
			}
		}
		r.setLen(a[0]);
		return r;
	}
	HPN operator * (HPN b){
		HPN r;
		for(int i=1;i<=a[0];++i){
			int c=0;
			for(int j=1;j<=b[0];++j){
				r[i+j-1]+=a[i]*b[j]+c;
				c=r[i+j-1]/10;
				r[i+j-1]%=10;
			}
			r[i+b[0]]+=c;
		}
		r.setLen(a[0]+b[0]);
		return r;
	}
	void addNum(int x){
		if(a[0]==1&&a[1]==0){
			a[1]=x;
		}else{
			for(int i=a[0];i>=1;i--){
				a[i+1]=a[i];
			}
			a[1]=x;
			a[0]++;
		}
	}
	HPN operator / (HPN b){
		HPN r,x(0),zero(0);
		for(int i=a[0];i>=1;--i){
			int q=0;
			x.addNum(a[i]);
			while(x>=b){
				x=x-b;
				q++;
			}
			r[i]=q;
		}
		r.setLen(a[0]);
		return r;
	}
};
HPN fastPow(HPN a,HPN b){
	if(b[0]==1&&b[1]==1){
		return a;
	}
	HPN two("2");
	HPN m("1");
	if(b[1]%2){
		m=m*a;
	}
	b=b/two;
	return fastPow(a*a,b)*m;
}
int main(){
	cin>>sa>>sb>>sp>>op;
	HPN a(sa),b(sb),p(sp);
	HPN c;
	HPN r;
	HPN q;
	switch(op){
		case '+':
			c=a+b;
		case '-':
			c=a-b;
		case '*':
			c=a*b;
		case '/':
			c=a/b;
		case '^':
			c=fastPow(a,b);
	}
	r=c/p;
	q=r*p;
	c=c-q;//c mod p=c-(c/p)*p 
	c.show();
	return 0;
}
2024/8/20 09:43
加载中...