报错: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;
}