头文件BigData.h:#ifndefBIG_DATA_H#defineBIG_DATA_H#include<string>#defineMAX_INT640x7FFFFFFFFFFFFFFF#defineMIN_INT640x8000000000000000#defineUN_INIT0xCCCCCCCCCCCCCCCCtypedeflonglongINT64;classBigData{public:BigData(INT64value=0xCCCCCCCCCCCCCCCC);BigData(constchar*pData);BigDataoperator+(constBigData&bigdata);//传值方式BigDataoperator-(constBigData&bigdata);BigDataoperator*(constBigData&bigdata);BigDataoperator/(constBigData&bigdata);private:boolIsINT64OverFlow()const;voidINT64ToString();boolIsLeftStrBig(constchar*pLeft,intLSize,constchar*pRight,intRSize);charSubLoop(char*pLeft,intLSize,constchar*pRight,intRSize);friendstd::ostream&operator<<(std::ostream&_cout,constBigData&bigdata);std::stringAdd(std::stringleft,std::stringright);std::stringSub(std::stringleft,std::stringright);std::stringMul(std::stringleft,std::stringright);std::stringDiv(std::stringleft,std::stringright);private:INT64_value;std::string_strData;};#endif源文件BigData.cpp:#define_CRT_SECURE_NO_WARNINGS1#include"BigData.h"#include<assert.h>#include<string>//构造函数BigData::BigData(INT64value):_value(value){INT64ToString();}//拷贝构造函数BigData::BigData(constchar*pData){//参数检测if(NULL==pData){assert(false);return;}charcSombol=pData[0];char*pStr=(char*)pData;//检查符号,"+","-"if('+'==cSombol||'-'==cSombol){pStr++;}//检查第一位字符位elseif(cSombol>='0'&&cSombol<='9'){cSombol='+';}//处理全为空格,“”else{return;}//消除0,“000012345”while(*pStr=='0'){pStr++;}_strData.resize(strlen(pData)+1);_strData[0]=cSombol;//保存符号位//处理非法字符,“123456qwe”_value=0;intiCount=1;while(*pStr>='0'&&*pStr<='9'){//转化步骤_value=_value*10+(*pStr-'0');_strData[iCount++]=*pStr;pStr++;}_strData.resize(iCount);//处理负数if(cSombol=='-'){_value=0-_value;}}//大数加法BigDataBigData::operator+(constBigData&bigdata){//左右操作数都没有溢出,为内置类型if(IsINT64OverFlow()&&bigdata.IsINT64OverFlow()){//异号相加,+,-if(_strData[0]!=bigdata._strData[0]){returnBigData(_value+bigdata._value);}else//同号相加{INT64tmp=MIN_INT64-_value;if((_value>=0&&MAX_INT64-_value>=bigdata._value)||(_value<0&&tmp/*MIN_INT64-_value*/<=bigdata._value)){returnBigData(_value+bigdata._value);}}}//至少有一个溢出或结果溢出if(_strData[0]==bigdata._strData[0]){returnBigData(Add(_strData,bigdata._strData).c_str());}returnBigData(Sub(_strData,bigdata._strData).c_str());}//大数减法BigDataBigData::operator-(constBigData&bigdata){//同号相减if(IsINT64OverFlow()&&bigdata.IsINT64OverFlow()){if(_strData[0]==bigdata._strData[0]){returnBigData(_value-bigdata._value);}else//异号无溢出{if((_value>0&&MAX_INT64+bigdata._value>=_value)||(_value<0&&MIN_INT64+bigdata._value<=_value)){returnBigData(_value-bigdata._value);}}}//有溢出if(_strData[0]!=bigdata._strData[0])//异号{returnBigData(Add(_strData,bigdata._strData).c_str());}returnBigData(Sub(_strData,bigdata._strData).c_str());}//大数乘法BigDataBigData::operator*(constBigData&bigdata){//除数不为0if(_value==0||bigdata._value==0){returnBigData(INT64(0));}//没有溢出if(IsINT64OverFlow()&&bigdata.IsINT64OverFlow()){//同号if(_strData[0]==bigdata._strData[0]){if((_value>0&&MAX_INT64/_value>=bigdata._value)||(_value<0&&MIN_INT64/_value<=bigdata._value)){returnBigData(_value*bigdata._value);}}//异号else{if((_value>0&&MAX_INT64/_value<=bigdata._value)||(_value<0&&MIN_INT64/_value>=bigdata._value)){returnBigData(_value*bigdata._value);}}}returnBigData(Mul(_strData,bigdata._strData).c_str());}//大数除法BigDataBigData::operator/(constBigData&bigdata){//除数为零if(bigdata._strData[1]=='0'){assert(false);}//都没溢出if(IsINT64OverFlow()&&bigdata.IsINT64OverFlow()){returnBigData(_value/bigdata._value);}//被除数小于除数if(_strData.size()<bigdata._strData.size()||//123123445(_strData.size()==bigdata._strData.size()&&//22392234strcmp(_strData.c_str()+1,bigdata._strData.c_str()+1)<0)){returnBigData(INT64(0));}//if(bigdata._strData=="+1"||_strData=="-1"){std::stringret=_strData;if(_strData[0]!=bigdata._strData[0]){ret[0]='-';}returnBigData(ret.c_str());}//数值相等if(strcmp(_strData.c_str()+1,bigdata._strData.c_str()+1)==0){std::stringret="+1";if(_strData[0]!=bigdata._strData[0]){ret[0]='-';}returnBigData(ret.c_str());}returnBigData(Div(_strData,bigdata._strData).c_str());}//字符串加法std::stringBigData::Add(std::stringleft,std::stringright){intiLSize=left.size();intiRSize=right.size();if(iLSize<iRSize){std::swap(left,right);//长的放在左边std::swap(iLSize,iRSize);}std::stringsRet;sRet.resize(iLSize+1);//最高位可能有进位sRet[0]=left[0];charstep=0;//记录进位for(intiIdx=1;iIdx<iLSize;iIdx++){charcRet=left[iLSize-iIdx]-'0'+step;if(iIdx<iRSize){cRet+=(right[iRSize-iIdx]-'0');}sRet[iLSize-iIdx+1]=cRet%10+'0';step=cRet/10;}sRet[1]=step+'0';//最高位的进位returnsRet;}//字符串减法std::stringBigData::Sub(std::stringleft,std::stringright){intiLSize=left.size();intiRSize=right.size();charcSymbol=left[0];if(iLSize<iRSize||iLSize==iRSize&&left<right){std::swap(left,right);std::swap(iLSize,iRSize);if(cSymbol=='+'){cSymbol='-';}else{cSymbol='+';}}std::stringstrRet;//保存结果strRet.resize(left.size());strRet[0]=cSymbol;//从低往高,取left的每一位//从低往高,取right的每一位for(intIdx=1;Idx<iLSize;Idx++){charcRet=left[iLSize-Idx]-'0';if(Idx<iRSize){cRet-=(right[iRSize-Idx]-'0');}//判断是否借位if(cRet<0){left[iLSize-Idx-1]-=1;cRet+=10;}strRet[iLSize-Idx]=cRet+'0';}returnstrRet;}//字符串乘法std::stringBigData::Mul(std::stringleft,std::stringright){//确定符号位charcSymbol='+';if(left[0]!=right[0]){cSymbol='-';}intiLSize=left.size();intiRSize=right.size();if(iLSize>iRSize){std::swap(left,right);std::swap(iLSize,iRSize);}std::stringsRet;sRet.assign(iLSize+iRSize-1,'0');sRet[0]=cSymbol;intiDataLen=sRet.size();intioffset=0;//记录偏移量//取左边一位,与右边的每一位相乘for(intiLIdx=1;iLIdx<iLSize;++iLIdx){charcLeft=left[iLSize-iLIdx]-'0';charcStep=0;if(cLeft==0){ioffset++;continue;}for(intiRIdx=1;iRIdx<iRSize;++iRIdx){charcRet=cLeft*(right[iRSize-iRIdx]-'0')+cStep;cRet+=sRet[iDataLen-iRIdx-ioffset]-'0';sRet[iDataLen-iRIdx-ioffset]=(cRet%10)+'0';cStep=cRet/10;}sRet[iDataLen-iRSize-ioffset]+=cStep;ioffset++;}returnsRet;}//字符串除法std::stringBigData::Div(std::stringleft,std::stringright){std::stringsRet;//符号位sRet.append(1,'+');if(left[0]!=right[0]){sRet[0]='-';}char*pLeft=(char*)(left.c_str()+1);char*pRight=(char*)(right.c_str()+1);intLSize=left.size()-1;intDataLen=right.size()-1;for(intiIdx=0;iIdx<LSize;){//处理被除数中的0if(*pLeft=='0'){sRet.append(1,'0');pLeft++;iIdx++;continue;}if(!IsLeftStrBig(pLeft,DataLen,pRight,right.size()-1)){sRet.append(1,'0');DataLen++;if(DataLen+iIdx>LSize){break;}}else{sRet.append(1,SubLoop(pLeft,DataLen,pRight,right.size()-1));while(*pLeft=='0'&&DataLen>0){pLeft++;iIdx++;DataLen--;}DataLen++;if(DataLen+iIdx>LSize){break;}}}returnsRet;}//判断左边的数大于右边的数boolBigData::IsLeftStrBig(constchar*pLeft,intLSize,constchar*pRight,intRSize){if(LSize>RSize||LSize==RSize&&strcmp(pLeft,pRight)>=0){returntrue;}returnfalse;}//循环相减charBigData::SubLoop(char*pLeft,intLSize,constchar*pRight,intRSize){assert(pLeft!=NULL&&pRight!=NULL);charcRet='0';while(true){//左小于右if(!IsLeftStrBig(pLeft,LSize,pRight,RSize)){break;}intLDataLen=LSize-1;intRDataLen=RSize-1;//处理循环相减while(LDataLen>=0&&RDataLen>=0){charret=pLeft[LDataLen]-'0';ret-=pRight[RDataLen]-'0';if(ret<0){pLeft[LDataLen-1]-=1;ret+=10;}pLeft[LDataLen]=ret+'0';LDataLen--;RDataLen--;}//跳过相减产生的多余的0while(*pLeft=='0'&&LSize>0){pLeft++;LSize--;}cRet++;}returncRet;}//检查是否溢出boolBigData::IsINT64OverFlow()const{//+9223372036854775807//-9223372036854775808std::stringtmp("+9223372036854775807");if(_strData[0]=='-'){tmp="-9223372036854775808";}if(_strData.size()<tmp.size()){returntrue;}elseif((_strData.size()==tmp.size())&&(_strData<=tmp)){returntrue;}returnfalse;}voidBigData::INT64ToString(){//处理符号位INT64tmp=_value;charcSymbol='+';if(_value<0){cSymbol='-';}_strData.append(1,cSymbol);//append追加//转化while(tmp){intc=tmp%10;if(c<0){c=0-c;}_strData.append(1,c+'0');tmp/=10;}char*pleft=(char*)_strData.c_str()+1;char*pright=pleft+_strData.size()-2;while(pleft<pright){charcTemp=*pleft;*pleft++=*pright;*pright--=cTemp;}}//重载输出操作符std::ostream&operator<<(std::ostream&_cout,constBigData&bigdata){if(bigdata.IsINT64OverFlow()){_cout<<bigdata._value<<std::endl;}else{char*pData=(char*)bigdata._strData.c_str();if('+'==pData[0]){pData++;}_cout<<pData<<std::endl;}return_cout;}测试BigDataTest.cpp:#define_CRT_SECURE_NO_WARNINGS1#include<iostream>usingnamespacestd;#include"BigData.h"voidtest1()//测试加法{//BigDatab1(23456);//BigDatab2("23456");//BigDatab3("+23456");//BigDatab4("+23456dfg");//BigDatab5("-23456");//BigDatab6("");//BigDatab7("000000023456");//cout<<b1<<endl;//cout<<b2<<endl;//cout<<b3<<endl;//cout<<b4<<endl;//cout<<b5<<endl;//cout<<b6<<endl;//cout<<b7<<endl;/*BigDataleft(36789);BigDataright(23761);cout<<left+right<<endl;*//*BigDataleft(9223372036854775807);BigDataright(2);cout<<left+right<<endl;*//*BigDataleft1("-9223372036854775808");BigDataright1("-3");cout<<left1+right1<<endl;*/BigDataleft("99999999999999999999999999999999");BigDataright("11111111111111111111111111111111");cout<<left+right<<endl;}voidtest2()//测试减法{/*BigDataleft(56789);BigDataright(25323);cout<<left-right<<endl;*//*BigDataleft(9223372036854775807);BigDataright(999);cout<<left-right<<endl;*//*BigDataleft("111111111111111111111111111111111111111");BigDataright("99");cout<<left-right<<endl;*//*BigDataleft(9223372036854775807);BigDataright(-999);cout<<left-right<<endl;*//*BigDataleft("-9223372036854775808");BigDataright("999");cout<<left-right<<endl;*/BigDataleft("-9223372036854775809");BigDataright("-999");cout<<left-right<<endl;}voidtest3()//测试乘法{/*BigDataleft("99");BigDataright("999999999999999999999999999999999");cout<<left*right<<endl;*///BigDataleft(99999);//BigDataright(99);//cout<<left*right<<endl;/*BigDataleft("99");BigDataright("-999999999999999999999999999999999");cout<<left*right<<endl;*/BigDataleft(-99);BigDataright(99999);cout<<left*right<<endl;}voidtest4()//测试除法{/*BigDataleft(99999);BigDataright(99999);cout<<left/right<<endl;*//*BigDataleft("222222222222222222222222222222");BigDataright("33");cout<<left/right<<endl;*//*BigDataleft(-999990000000000);BigDataright(99999);cout<<left/right<<endl;*/BigDataleft(678789);BigDataright(99999135547);cout<<left/right<<endl;}intmain(){//test1();//test2();//test3();test4();system("pause");return0;}