大資料操作,有如下問題:
計算:456789135612326542132123+14875231656511323132
456789135612326542132123*14875231656511323132
比較:7531479535511335666686565>753147953551451213356666865?
longlong類型儲存不了,儲存不了就實現不成計算,怎麼辦。。。
為瞭解決以上問題,所以得定義一種結構類型以儲存這些資料,並重載運算子支援這些資料的操作,為了方便代碼的複用因此有了如下代碼:
#include<cstdio>#include<cstring>#include<iostream>usingnamespacestd;constintmaxn=200;structbign{intlen,s[maxn];/*以下的建構函式是C++中特有的,作用是進行初始化。事實上,當定義bignx時,就會執行這個函數,把x.s清零,並賦x.len=1。需要說明的是,在C++中,並不需要typedef就可以直接用結構體名來定義,而且還提供“自動初始化”的功能,從這個意義上說,C++比C語言方便*/bign(){memset(s,0,sizeof(s));len=1;}bign(intnum){*this=num;}//定義為const參數,作用是不能對const參數的值做修改bign(constchar*num){*this=num;}/*以上是構造方法,初始化時對執行相應的方法*/bignoperator=(intnum){chars[maxn];sprintf(s,"%d",num);*this=s;return*this;}//函數定義後的const關鍵字,它表明“x.str()不會改變x”stringstr()const{stringres="";for(inti=0;i<len;i++)res=(char)(s[i]+'0')+res;if(res=="")res="0";returnres;}voidclean(){while(len>1&&!s[len-1])len--;}/*以下是重載操作符*/bignoperator=(constchar*num){//逆序儲存,方便計算len=strlen(num);for(inti=0;i<len;i++)s[i]=num[len-i-1]-'0';return*this;}bignoperator+(constbign&b)const{bignc;c.len=0;for(inti=0,g=0;g||i<max(len,b.len);i++){intx=g;if(i<len)x+=s[i];if(i<b.len)x+=b.s[i];c.s[c.len++]=x%10;g=x/10;}returnc;}bignoperator*(constbign&b){bignc;c.len=len+b.len;for(inti=0;i<len;i++)for(intj=0;j<b.len;j++)c.s[i+j]+=s[i]*b.s[j];for(inti=0;i<c.len-1;i++){c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}c.clean();returnc;}bignoperator-(constbign&b){bignc;c.len=0;for(inti=0,g=0;i<len;i++){intx=s[i]-g;if(i<b.len)x-=b.s[i];if(x>=0)g=0;else{g=1;x+=10;}c.s[c.len++]=x;}c.clean();returnc;}booloperator<(constbign&b)const{if(len!=b.len)returnlen<b.len;for(inti=len-1;i>=0;i--)if(s[i]!=b.s[i])returns[i]<b.s[i];returnfalse;}booloperator>(constbign&b)const{returnb<*this;}booloperator<=(constbign&b){return!(b>*this);}booloperator==(constbign&b){return!(b<*this)&&!(*this<b);}bignoperator+=(constbign&b){*this=*this+b;return*this;}};istream&operator>>(istream&in,bign&x){strings;in>>s;x=s.c_str();returnin;}ostream&operator<<(ostream&out,constbign&x){out<<x.str();returnout;}intmain(){bigna;cin>>a;a+="123456789123456789000000000";cout<<a*2<<endl;return0;}