#include class i_string { private: char *str; int len; public: //构造函数 ~i_string(); i_string(); i_string(i_string &); i_string(char *); i_string(char ); i_string(int ); i_string(char *,int ); i_string(char ,int ); i_string(i_string& ,int); public: //位数控制输出 void Sci_out(int ); void Sci_outln(int ); void Sci_out(); void Sci_outln(); public: //功能函数 int length(){ return len;} char* begin(){ return &str[0];} char* end(){ return &str[len];} char* Str(){ return str;} void insert(int ,char *); void insert(int ,char); void insert(int ,i_string &); void reserve(); void reserve(int,int); void swap(int ,int); void remove(char); void remove(int,int,char); void remove(char*); void remove(int ,int, char*); void remove(int ); void remove(int,int); void erase(char*); void erase(int ); i_string substring(int,int); i_string substring(int); _int64 valueof(); _int64 valueof(int,int); void reset(); friend void swap(char*,char*); friend void swap(char&,char&); friend void Reset(char*); friend void Reserve(char*); friend void get_next(char*,int*); friend _int64 valueof(i_string &); friend _int64 valueof(char *); friend int valueof(char ); bool empty(); bool Figure(); void clear(); public: //值运算函数 i_string add(i_string &); i_string add(char *); i_string add(char ); i_string add(int ); i_string add(_int64); i_string mul(i_string &); i_string mul(char *); i_string mul(char ); i_string mul(int ); i_string mul(_int64 ); i_string sub(i_string &); i_string sub(char *); i_string sub(char ); i_string sub(int ); i_string sub(_int64 ); public: //运算符重载 i_string &operator =(i_string &); i_string &operator =(char *); i_string &operator =(char ); bool operator < (i_string &); bool operator > (i_string &); bool operator <= (i_string &); bool operator >= (i_string &); bool operator == (i_string &); bool operator != (i_string &); void operator += (i_string &); void operator += (char *); void operator += (char ); i_string operator * (int ); i_string operator ^ (int); i_string operator + (i_string & ); i_string operator + (char *); i_string operator + (char ); i_string operator <<(int ); i_string operator >>(int ); public: //特殊运算符 friend istream & operator >> ( istream &is , i_string &ch ) { is>>ch.str; ch.len=strlen(ch.str); return is; } friend ostream & operator << (ostream &os , i_string &ch ) { os< i_string::~i_string() { delete []str; } i_string::i_string(char *s) { len=strlen(s); str=new char[len+1]; strcpy(str,s); str[len]=NULL; } i_string::i_string(char c,int n) { len=n; str=new char[len+1]; for(int i=0;i i_string::i_string(int n) { len=n; str=new char[len+1]; for(int i=0;i i_string:: i_string(char *s,int n) { int k=strlen(s); len=n*k; str=new char[len+1]; for(int i=0;i this->Sci_out(w); cout< void i_string::Sci_outln() { this->Sci_out(1); cout< i_string& i_string::operator =(char *ch) { str=new char[strlen(ch)+1]; strcpy(str,ch); len=strlen(ch); str[len]=NULL; return *this; } i_string& i_string::operator =(char c) { str=new char[2]; str[0]=c;len=1; str[len]=NULL; return *this; } void i_string::operator +=(i_string &ch) { int k1=len,k2=ch.len; str=(char*)realloc(str,(k2+k1+1)*sizeof(char)); for(int i=0;i int k1=len,k2=strlen(ch); str=(char*)realloc(str,(k2+k1+1)*sizeof(char)); for(int i=0;i int k1=len,k2=strlen(ch),i; i_string STR(k1+k2); for(i=0;i return *this+ch.str; } void i_string::operator += (char ch) { str=(char*)realloc(str,(2+len)*sizeof(char)); str[len++]=ch; str[len]=NULL; } i_string i_string::operator * (int c) { i_string STR(*this); while(--c) STR+=*this; return STR; } i_string i_string::operator ^(int c) { if(c<0) { cout<<\"Runtime error\"< i_string i_string::operator + (char ch) { char *c=new char[2]; c[0]=ch;c[1]=NULL; return *this+c; } i_string i_string::operator<<(int n) { if(n<0) { cout<<\"Input error\"< if(len i_string i_str1(*this),i_str2(ch); i_str1=i_str1.sub(i_str2); if(i_str1[0]=='-') return true; return false; } if(strcmp(str,ch.str)<0) return true; return false; } bool i_string::operator > (i_string &ch) { if(this->Figure()&&ch.Figure()) { i_string i_str1(*this),i_str2(ch); i_str1=i_str2.sub(i_str1); if(i_str1[0]=='-') return true; return false; } if(strcmp(str,ch.str)>0) return true; return false; } bool i_string::operator == (i_string &ch) { if(this->Figure()&&ch.Figure()) { i_string i_str1(*this),i_str2(ch); i_str1=i_str1.sub(i_str2); if(i_str1[0]=='0') return true; return false; } if(strcmp(str,ch.str)==0) return true; return false; } bool i_string::operator != (i_string &ch) { if(this->Figure()&&ch.Figure()) { i_string i_str1(*this),i_str2(ch); i_str1=i_str1.sub(i_str2); if(i_str1[0]=='0') return false; return true; } if(strcmp(str,ch.str)!=0) return true; return false; } bool i_string::operator >= (i_string &ch) { if(this->Figure()&&ch.Figure()) { i_string i_str1(*this),i_str2(ch); i_str1=i_str1.sub(i_str2); if(i_str1[0]>='0') return true; return false; } if(strcmp(str,ch.str)>=0) return true; return false; } bool i_string::operator <= (i_string &ch) { if(this->Figure()&&ch.Figure()) { i_string i_str1(*this),i_str2(ch); i_str1=i_str1.sub(i_str2); if(i_str1[0]<='0') return true; return false; } if(strcmp(str,ch.str)<=0) return true; return false; } /////////////////////////////////////////////////////////////// //////////////// 功能函数 //////////////////////// ////////////////////////////////////////////////////////////// void i_string::insert(int pos,char c) { if(pos>len) { cout<<\"You can't insert int the outside!\"< void i_string::insert(int pos,char *ch) { if(pos>len) { cout<<\"You can't insert outside!\"< for(i=len-1;i>pos+k-1;i--) str[i]=str[i-k]; for(;i>=pos;i--) str[i]=ch[--k]; str[len]=NULL; } void i_string::insert(int pos,i_string& ch) { if(pos>len) { cout<<\"You can't insert outside!\"< void i_string::swap(int p1,int p2) { if(p1<1||p2<1||p1>len||p2>len) { cout<<\"Swap should inside!\"< void swap(char *p1,char *p2) { char tem=*p1; *p1=*p2; *p2=tem; } void swap(char &p1,char &p2) { char tem=p1; p1=p2; p2=tem; } void i_string::reserve() { for(int i=1;i void Reserve(char *ch) { int Len=strlen(ch); for(int i=0;i _int64 i_string::valueof() { if(len>19) { cout<<\"Too large value!\"< int valueof(char c) { if(c>'9'||c<'0') { cout<<\"Transform error\"< ans=1; } if(p1<1||p2>len) { cout<<\"Get value should inside!\"< bool i_string::empty() { if(str[0]!=NULL) return false; return true; } i_string i_string::substring(int p1,int p2) { int ans=0; if(p1>p2) { swap(p1,p2);ans=1; } if(p1<1||p2>len) { cout<<\"Get substring should inside!\"< if(p2>len||p2<-len) { cout<<\"Get substring should inside!\"< void i_string::erase(char *dz) { char *i=dz; for(;(i+1)!=this->end();i++) *i=*(i+1); str=(char*)realloc(str,len*sizeof(char)); *i=NULL; len=len-1; } void i_string::remove(char c) { int k=0,i; for(i=0;i void i_string::remove(int p1,int p2) { if(p1>p2) swap(p1,p2); if(p1==p2) return; if(p1==0) p1=1; if(p1<1||p2>len) { cout<<\"Remove should inside!\"< void i_string::erase(int fig) { if(fig==0) return; if(fig<0||fig>len) { cout<<\"Erase should inside!\"< void get_next(char *T,int *next) // 外部辅助函数 { next[0]=-1; int k=-1,j=0; while(T[j]) { if(k!=-1&&T[k]!=T[j]) k=next[k]; j++;k++; if(T[k]==T[j]) next[j]=next[k]; else next[j]=k; } } void i_string::remove(int p1,int p2,char *T) { if(p1>p2) swap(p1,p2); if(p1<1||p2>len) { cout<<\"Remove should inside!\"< if(p2-p1 delete []next; for(j=i=p1-1;i bool i_string::Figure() { if(str[0]=='-'||(str[0]>='0'&&str[0]<='9')) { for(int i=1;i bool figure(char *ch) { if(ch[0]=='-'||(ch[0]>='0'&&ch[0]<='9')) { for(int i=1;ch[i]!='\\0';i++) str[i-k]='#'; if(ch[i]<'0'||ch[i]>'9') return false ; return true; } return false; } void i_string::reset() { int i; if(len==1) return; if(str[0]=='-') { for(i=1;i void Reset(char *ch) { int i,k,Len=strlen(ch); for(i=0;i //////////////////////////////////////////////////////////////// ////////////// 值运算函数 ////////////////////////// /////////////////////////////////////////////////////////////// i_string i_string::mul(char *s) 效率为O(mn/64); { if(!this->Figure()||!figure(s)) { cout<<\"Calculation must between digitals\"< _int64 *d=new _int64[r1+r2+1]; for(i=0;i if(j%8) for(i=0;i<(8-j%8);i++) {b[r2++]=0;u++;} _int64 *a8=new _int64[r1/8+2]; _int64 *b8=new _int64[r2/8+2]; for(i=0;i d[i]+=temp; } int sp[9], k=0; char *p=new char[r1+r2+1]; while(d[0]) { sp[k++]=d[0]%10; d[0]/=10; } for(j=0;k>0;k--) p[j++]=sp[k-1]+'0'; for(i=1;i i_string i_string::mul(i_string &ch) { return this->mul(ch.str); } i_string i_string::mul(char c) { i_string ch(c); return this->mul(ch); } i_string i_string::mul(_int64 fig) { if(fig>0) { int k=(int)log10(fig*1.0)+1; char *ch=new char[k+1]; ch[k]=NULL; while(k--) { ch[k]=fig%10+'0'; fig/=10; } return this->mul(ch); } else if(fig<0) { fig=-fig; int k=(int)log10(fig*1.0)+2; char *ch=new char[k+1]; ch[k]=NULL; while(k>1) { ch[--k]=fig%10+'0'; fig/=10; } ch[0]='-'; return this->mul(ch); } i_string ZERO(1); return ZERO; } i_string i_string::mul(int fig) { return this->mul((_int64) fig); } i_string i_string::add(char *c) { if(!this->Figure()||!figure(c)) { cout<<\"Calculation must between digitals\"< return STR.sub(str+1); } this->reserve(); int i,Len=strlen(c); char *ch=new char[Len+1]; for(i=0;i for(i=0;i STR.str[STR.len++]=temp+'0'; STR.str[STR.len]=NULL; } delete []ch; this->reserve(); STR.reserve();STR.reset(); return STR; } i_string i_string::add(i_string &ch) { if(ch[0]=='-') return this->sub(ch.str+1); return this->add(ch.str); } i_string i_string::add(char c) { char *ch=new char[2]; ch[0]=c;ch[1]=NULL; return this->add(ch); } i_string i_string::add(_int64 c) { if(c>0) { int k=(int) log10(c*1.0)+1; char *ch=new char[k+1]; ch[k]='\\0'; while(k--) { ch[k]=c%10+'0'; c/=10; } if(str[0]=='-') { i_string STR(ch); return STR.sub(str+1); } return this->add(ch); } if(c<0) return this->sub(-c); return *this; } i_string i_string::add(int c) { if(c>0) return this->add((_int64)c); if(c<0) return this->sub((_int64)-c); i_string i_str(*this); i_str.reset(); return i_str; } i_string i_string::sub(char *s) { if(!this->Figure()||!figure(s)) { cout<<\"Calculation must between digitals\"< for(i=0;i temp=1; } } for(;i else if(i_str.len temp=1; } } STR.str=(char*)realloc(STR.str,(L+2)*sizeof(char)); STR.str[STR.len++]='-';STR.str[STR.len]=NULL; STR.reserve(); STR.reset(); return STR; } else { for(i=L-1;i>=0;i--) { if(i_str.str[i]!=ch[i]) break; } if(i<0) { i_string ZERO(1); return ZERO; } if(i_str.str[i]>ch[i]) { for(i=0;i STR.reserve();STR.reset(); return STR; } else for(i=0;i } else { STR.str[i]=ch[i]-i_str.str[i]-temp+10+'0'; temp=1; } } STR.str=(char*)realloc(STR.str,(L+2)*sizeof(char)); STR[STR.len++]='-';STR[STR.len]=NULL; STR.reserve(); STR.reset(); return STR; } } i_string i_string::sub(i_string &ch) { if(ch[0]=='-') return this->add(ch.str+1); return this->sub(ch.str); } i_string i_string::sub(char c) { char *ch=new char[2]; ch[0]=c;ch[1]=NULL; return this->sub(ch); } i_string i_string::sub(_int64 c) { if(c>0) { int k=(int) log10(c*1.0)+1; char *ch=new char[k+1]; ch[k]='\\0'; while(k--) { ch[k]=c%10+'0'; c/=10; } return this->sub(ch); } if(c<0) return this->add(-c); return *this; } i_string i_string::sub(int c) { if(c>0) return this->sub((_int64)c); if(c<0) return this->add((_int64)-c); i_string i_str(*this); i_str.reset(); return i_str; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////main函数///////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main() //////////////测试 { i_string s0,s1(\"-00999900\"),s2(\"-00123\"),s3('1',3),s4(\"123\ cout<<\"测试\"< 因篇幅问题不能全部显示,请点此查看更多更全内容