生活随笔
收集整理的這篇文章主要介紹了
高精度模板 c++/类封装
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)還在POJ上面寫過一個(gè)浮點(diǎn)數(shù)的乘法和加法運(yùn)算,但個(gè)別題目會(huì)用到,所以不加進(jìn)去了.
[cpp]?view plaincopy
#include<iostream>?? #include<cstring>?? #include<string>?? #include<cstdio>?? ?? using?namespace?std;?? ?? #define?MAXN?1000?? ?? struct?HP?? {?? ????int?len,s[MAXN];?? ????HP()?? ????{?? ????????memset(s,0,sizeof(s));?? ????????len=1;?? ????}?? ?? ????HP?operator?=(const?char?*num)??? ????{?? ????????len=strlen(num);?? ????????for(int?i=0;i<len;i++)?s[i]=num[len-i-1]-'0';?? ????}?? ?? ????HP?operator?=(int?num)??? ????{?? ????????char?s[MAXN];?? ????????sprintf(s,"%d",num);?? ????????*this=s;?? ????????return?*this;?? ????}?? ?? ????HP(int?num)?{?*this=num;}?? ?? ????HP(const?char*num)?{*this=num;}?? ?? ????string?str()const??? ????{?? ????????string?res="";?? ????????for(int?i=0;i<len;i++)?res=(char)(s[i]+'0')+res;?? ????????if(res=="")?res="0";?? ????????return?res;?? ????}?? ?? ????HP?operator?+(const?HP&?b)?const?? ????{?? ????????HP?c;?? ????????c.len=0;?? ????????for(int?i=0,g=0;g||i<max(len,b.len);i++)?? ????????{?? ????????int?x=g;?? ????????if(i<len)?x+=s[i];?? ????????if(i<b.len)?x+=b.s[i];?? ????????c.s[c.len++]=x%10;?? ????????g=x/10;?? ????????}?? ????????return?c;?? ????}?? ????void?clean()?? ????{?? ????????while(len?>?1?&&?!s[len-1])?len--;?? ????}?? ?? ????HP?operator?*(const?HP&?b)?? ????{?? ????????HP?c;?? ????????c.len=len+b.len;?? ????????for(int?i=0;i<len;i++)?? ????????for(int?j=0;j<b.len;j++)?? ????????????c.s[i+j]+=s[i]*b.s[j];?? ????????for(int?i=0;i<c.len-1;i++)?? ????????{?? ????????c.s[i+1]+=c.s[i]/10;?? ????????c.s[i]%=10;?? ????????}?? ????????c.clean();?? ????????return?c;?? ????}?? ?? ????HP?operator?-?(const?HP&?b)?? ????{?? ????????HP?c;?? ????????c.len?=?0;?? ????????for(int?i=0,g=0;i<len;i++)?? ????????{?? ????????int?x=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();?? ????????return?c;?? ????}?? ????HP?operator?/?(const?HP?&b)?? ????{?? ????????HP?c,?f?=?0;?? ????????for(int?i?=?len-1;?i?>=?0;?i--)?? ????????{?? ????????????f?=?f*10;?? ????????????f.s[0]?=?s[i];?? ????????????while(f>=b)?? ????????????{?? ????????????????f?=f-b;?? ????????????????c.s[i]++;?? ????????????}?? ????????}?? ????????c.len?=?len;?? ????????c.clean();?? ????????return?c;?? ????}?? ?????HP?operator?%?(const?HP?&b)?? ????{?? ????????HP?r?=?*this?/?b;?? ????????r?=?*this?-?r*b;?? ????????return?r;?? ????}?? ?????? ?????HP?operator?/=?(const?HP?&b)?? ????{?? ????????*this??=?*this?/?b;?? ????????return?*this;?? ????}?? ?? ?? ????HP?operator?%=?(const?HP?&b)?? ????{?? ????????*this?=?*this?%?b;?? ????????return?*this;?? ????}?? ?????? ????bool?operator?<?(const?HP&?b)?const?? ????{?? ????????if(len?!=?b.len)?return?len?<?b.len;?? ????????for(int?i?=?len-1;?i?>=?0;?i--)?? ????????if(s[i]?!=?b.s[i])?return?s[i]?<?b.s[i];?? ????????????return?false;?? ????}?? ?? ????bool?operator?>?(const?HP&?b)?const?? ????{?? ????????return?b?<?*this;?? ????}?? ?? ????bool?operator?<=?(const?HP&?b)?? ????{?? ????????return?!(b?<?*this);?? ????}?? ?? ????bool?operator?==?(const?HP&?b)?? ????{?? ????????return?!(b?<?*this)?&&?!(*this?<?b);?? ????}?? ????bool?operator?!=?(const?HP?&b)?? ????{?? ????????return?!(*this?==?b);?? ????}?? ????HP?operator?+=?(const?HP&?b)?? ????{?? ????????*this?=?*this?+?b;?? ????????return?*this;?? ????}?? ????bool?operator?>=?(const?HP?&b)?? ????{?? ????????return?*this?>?b?||?*this?==?b;?? ????}?? ?? ????? };?? ?? istream&?operator?>>(istream?&in,?HP&?x)?? {?? ??string?s;?? ??in?>>?s;?? ??x?=?s.c_str();?? ??return?in;?? }?? ?? ostream&?operator?<<(ostream?&out,?const?HP&?x)?? {?? ??out?<<?x.str();?? ??return?out;?? }?? ?? ?? int?main()?? {?? ??HP?a;?? ??cin?>>?a;?? ??a?+=?"123456789123456789000000000";?? ??cout?<<?a*2?<<?endl;?? ??system("pause");?? ??return?0;?? }??
?當(dāng)需要用long long 壓縮多位的時(shí)候
?POJ Heritage?? (一個(gè)long long 壓縮8位)
[cpp]?view plaincopy
#include<iostream>?? #include<cstring>?? #include<string>?? #include<cstdio>?? ?? using?namespace?std;?? ?? #define?MAXN?4000?? ?? struct?HP?? {?? ????int?len;?? ????long?long?s[MAXN];?? ????HP()?? ????{?? ????????memset(s,0,sizeof(s));?? ????????len=1;?? ????}?? ?? ????HP?operator?=(const?char?*num)?? ????{?? ????????int?k=0,j=0;?? ????????long?long?mul=1,tmp=0;?? ????????for(int?i=strlen(num)-1;i>=0;i--)?? ????????{?? ????????????tmp=tmp*mul+(long?long)(num[i]-'0');?? ????????????j++,mul*=10;?? ????????????if(j==8)?? ????????????{?? ????????????????s[k++]=tmp;?? ????????????????j=0;?? ????????????????mul=1;?? ????????????????tmp=0;?? ????????????}?? ????????}?? ????????if(tmp!=0)?? ????????????s[k++]=tmp;?? ????????len=k;?? ????????return?*this;?? ????}?? ?? ????HP?operator?=(int?num)?? ????{?? ????????char?s[MAXN];?? ????????sprintf(s,"%d",num);?? ????????*this=s;?? ????????return?*this;?? ????}?? ?? ????HP(int?num)?{?*this=num;}?? ?? ????HP(const?char*num)?{*this=num;}?? ?? ????string?str()const?? ????{?? ????????string?res="";?? ????????for(int?i=0;i<len-1;i++)?? ????????{?? ????????????long?long?tmp=s[i];?? ????????????for(int?j=0;j<8;j++)?? ????????????{?? ????????????????res=(char)(tmp%10+'0')+res;?? ????????????????tmp/=10;?? ????????????}?? ????????}?? ????????long?long?tmp=s[len-1];?? ????????while(tmp!=0)?? ????????{?? ????????????res=(char)(tmp%10+'0')+res;?? ????????????tmp/=10;?? ????????}?? ????????if(res=="")?res="0";?? ????????return?res;?? ????}?? ?? ????HP?operator?+(const?HP&?b)?const?? ????{?? ????????HP?c;?? ????????c.len=0;?? ????????long?long?g=0;?? ????????for(int?i=0;g!=0||i<max(len,b.len);i++)?? ????????{?? ????????????long?long?x=g;?? ????????????if(i<len)?x+=s[i];?? ????????????if(i<b.len)?x+=b.s[i];?? ????????????c.s[c.len++]=x%100000000;?? ????????????g=x/100000000;?? ????????}?? ????????return?c;?? ????}?? ????void?clean()?? ????{?? ????????while(len?>?1?&&?!s[len-1])?len--;?? ????}?? ?? ????HP?operator?*(const?HP&?b)?? ????{?? ????????HP?c;?? ????????c.len=len+b.len;?? ????????for(int?i=0;i<len;i++)?? ????????????for(int?j=0;j<b.len;j++)?? ????????????????c.s[i+j]+=s[i]*b.s[j];?? ????????for(int?i=0;i<c.len-1;i++)?? ????????{?? ????????????c.s[i+1]+=c.s[i]/100000000;?? ????????????c.s[i]%=100000000;?? ????????}?? ????????c.clean();?? ????????return?c;?? ????}?? ?? ????HP?operator?-?(const?HP&?b)?? ????{?? ????????HP?c;?? ????????c.len?=?0;?? ????????long?long?g=0;?? ????????for(int?i=0;i<len;i++)?? ????????{?? ????????????long?long?x=s[i]-g;?? ????????????if(i<b.len)?x-=b.s[i];?? ????????????if(x>=0)?? ????????????????g=0;?? ????????????else?? ????????????{?? ????????????????g=1;?? ????????????????x+=100000000;?? ????????????}?? ????????????c.s[c.len++]=x;?? ????????}?? ????????c.clean();?? ????????return?c;?? ????}?? ????void?output()?? ????{?? ????????printf("%lld",s[len-1]);?? ????????for(int?i=len-2;i>=0;i--)?? ????????????printf("%.8lld",s[i]);?? ????????printf("\n");?? ????}?? };?? ?? ?? HP?a[20];?? int?n;?? ?? int?main()?? {?? ????a[0]=2;?? ????for(int?i=1;i<18;i++)?? ????????a[i]=a[i-1]*a[i-1]-a[i-1]+1;?? ????while(~scanf("%d",&n))?? ????{?? ????????for(int?i=0;i<n;i++)?? ????????????a[i].output();?? ????}?? ????return?0;?? ?? }??
?
浮點(diǎn)乘法?? 前導(dǎo)零只用clean清除,但是末尾需要轉(zhuǎn)化成string之后自行處理.del代表小數(shù)點(diǎn)第幾位之后
[cpp]?view plaincopy
HP?operator?*(const?HP&?b)?? {?? ????HP?c;?? ????c.len=len+b.len;?? ????c.del=del+b.del;?? ????for(int?i=0;i<len;i++)?? ????????for(int?j=0;j<b.len;j++)?? ????????????c.s[i+j]+=s[i]*b.s[j];?? ????for(int?i=0;i<c.len;i++)?? ????{?? ????????c.s[i+1]+=c.s[i]/10;?? ????????c.s[i]%=10;?? ????}?? ????c.clean();?? ????return?c;?? }??
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的高精度模板 c++/类封装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。