日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 大数类 大数模板

發(fā)布時間:2025/6/15 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 大数类 大数模板 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分別使用C++中的運算符重載的方法來實現(xiàn)大數(shù)之間的數(shù)學運算,包括加法、減法、乘法、除法、n次方、取模、大小比較、賦值以及輸入流、輸出流的重載。。

???????? 并且使用這個大數(shù)模板,順利AC了HDOJ上的1134這個題目的Catalan數(shù)計數(shù)問題。。http://acm.hdu.edu.cn/showproblem.php?pid=1134

大數(shù)模板的代碼如下:

[cpp]?view plaincopy
  • #include<iostream>???
  • #include<string>???
  • #include<iomanip>???
  • #include<algorithm>???
  • using?namespace?std;???
  • ??
  • #define?MAXN?9999??
  • #define?MAXSIZE?10??
  • #define?DLEN?4??
  • ??
  • class?BigNum??
  • {???
  • private:???
  • ????int?a[500];????//可以控制大數(shù)的位數(shù)???
  • ????int?len;???????//大數(shù)長度??
  • public:???
  • ????BigNum(){?len?=?1;memset(a,0,sizeof(a));?}???//構造函數(shù)??
  • ????BigNum(const?int);???????//將一個int類型的變量轉化為大數(shù)??
  • ????BigNum(const?char*);?????//將一個字符串類型的變量轉化為大數(shù)??
  • ????BigNum(const?BigNum?&);??//拷貝構造函數(shù)??
  • ????BigNum?&operator=(const?BigNum?&);???//重載賦值運算符,大數(shù)之間進行賦值運算??
  • ??
  • ????friend?istream&?operator>>(istream&,??BigNum&);???//重載輸入運算符??
  • ????friend?ostream&?operator<<(ostream&,??BigNum&);???//重載輸出運算符??
  • ??
  • ????BigNum?operator+(const?BigNum?&)?const;???//重載加法運算符,兩個大數(shù)之間的相加運算???
  • ????BigNum?operator-(const?BigNum?&)?const;???//重載減法運算符,兩個大數(shù)之間的相減運算???
  • ????BigNum?operator*(const?BigNum?&)?const;???//重載乘法運算符,兩個大數(shù)之間的相乘運算???
  • ????BigNum?operator/(const?int???&)?const;????//重載除法運算符,大數(shù)對一個整數(shù)進行相除運算??
  • ??
  • ????BigNum?operator^(const?int??&)?const;????//大數(shù)的n次方運算??
  • ????int????operator%(const?int??&)?const;????//大數(shù)對一個int類型的變量進行取模運算??????
  • ????bool???operator>(const?BigNum?&?T)const;???//大數(shù)和另一個大數(shù)的大小比較??
  • ????bool???operator>(const?int?&?t)const;??????//大數(shù)和一個int類型的變量的大小比較??
  • ??
  • ????void?print();???????//輸出大數(shù)??
  • };???
  • BigNum::BigNum(const?int?b)?????//將一個int類型的變量轉化為大數(shù)??
  • {???
  • ????int?c,d?=?b;??
  • ????len?=?0;??
  • ????memset(a,0,sizeof(a));??
  • ????while(d?>?MAXN)??
  • ????{??
  • ????????c?=?d?-?(d?/?(MAXN?+?1))?*?(MAXN?+?1);???
  • ????????d?=?d?/?(MAXN?+?1);??
  • ????????a[len++]?=?c;??
  • ????}??
  • ????a[len++]?=?d;??
  • }??
  • BigNum::BigNum(const?char*s)?????//將一個字符串類型的變量轉化為大數(shù)??
  • {??
  • ????int?t,k,index,l,i;??
  • ????memset(a,0,sizeof(a));??
  • ????l=strlen(s);?????
  • ????len=l/DLEN;??
  • ????if(l%DLEN)??
  • ????????len++;??
  • ????index=0;??
  • ????for(i=l-1;i>=0;i-=DLEN)??
  • ????{??
  • ????????t=0;??
  • ????????k=i-DLEN+1;??
  • ????????if(k<0)??
  • ????????????k=0;??
  • ????????for(int?j=k;j<=i;j++)??
  • ????????????t=t*10+s[j]-'0';??
  • ????????a[index++]=t;??
  • ????}??
  • }??
  • BigNum::BigNum(const?BigNum?&?T)?:?len(T.len)??//拷貝構造函數(shù)??
  • {???
  • ????int?i;???
  • ????memset(a,0,sizeof(a));???
  • ????for(i?=?0?;?i?<?len?;?i++)??
  • ????????a[i]?=?T.a[i];???
  • }???
  • BigNum?&?BigNum::operator=(const?BigNum?&?n)???//重載賦值運算符,大數(shù)之間進行賦值運算??
  • {??
  • ????int?i;??
  • ????len?=?n.len;??
  • ????memset(a,0,sizeof(a));???
  • ????for(i?=?0?;?i?<?len?;?i++)???
  • ????????a[i]?=?n.a[i];???
  • ????return?*this;???
  • }??
  • istream&?operator>>(istream?&?in,??BigNum?&?b)???//重載輸入運算符??
  • {??
  • ????char?ch[MAXSIZE*4];??
  • ????int?i?=?-1;??
  • ????in>>ch;??
  • ????int?l=strlen(ch);??
  • ????int?count=0,sum=0;??
  • ????for(i=l-1;i>=0;)??
  • ????{??
  • ????????sum?=?0;??
  • ????????int?t=1;??
  • ????????for(int?j=0;j<4&&i>=0;j++,i--,t*=10)??
  • ????????{??
  • ????????????sum+=(ch[i]-'0')*t;??
  • ????????}??
  • ????????b.a[count]=sum;??
  • ????????count++;??
  • ????}??
  • ????b.len?=count++;??
  • ????return?in;??
  • ??
  • }??
  • ostream&?operator<<(ostream&?out,??BigNum&?b)???//重載輸出運算符??
  • {??
  • ????int?i;????
  • ????cout?<<?b.a[b.len?-?1];???
  • ????for(i?=?b.len?-?2?;?i?>=?0?;?i--)??
  • ????{???
  • ????????cout.width(DLEN);???
  • ????????cout.fill('0');???
  • ????????cout?<<?b.a[i];???
  • ????}???
  • ????return?out;??
  • }??
  • ??
  • BigNum?BigNum::operator+(const?BigNum?&?T)?const???//兩個大數(shù)之間的相加運算??
  • {??
  • ????BigNum?t(*this);??
  • ????int?i,big;??????//位數(shù)?????
  • ????big?=?T.len?>?len???T.len?:?len;???
  • ????for(i?=?0?;?i?<?big?;?i++)???
  • ????{???
  • ????????t.a[i]?+=T.a[i];???
  • ????????if(t.a[i]?>?MAXN)???
  • ????????{???
  • ????????????t.a[i?+?1]++;???
  • ????????????t.a[i]?-=MAXN+1;???
  • ????????}???
  • ????}???
  • ????if(t.a[big]?!=?0)??
  • ????????t.len?=?big?+?1;???
  • ????else??
  • ????????t.len?=?big;?????
  • ????return?t;??
  • }??
  • BigNum?BigNum::operator-(const?BigNum?&?T)?const???//兩個大數(shù)之間的相減運算???
  • {????
  • ????int?i,j,big;??
  • ????bool?flag;??
  • ????BigNum?t1,t2;??
  • ????if(*this>T)??
  • ????{??
  • ????????t1=*this;??
  • ????????t2=T;??
  • ????????flag=0;??
  • ????}??
  • ????else??
  • ????{??
  • ????????t1=T;??
  • ????????t2=*this;??
  • ????????flag=1;??
  • ????}??
  • ????big=t1.len;??
  • ????for(i?=?0?;?i?<?big?;?i++)??
  • ????{??
  • ????????if(t1.a[i]?<?t2.a[i])??
  • ????????{???
  • ????????????j?=?i?+?1;???
  • ????????????while(t1.a[j]?==?0)??
  • ????????????????j++;???
  • ????????????t1.a[j--]--;???
  • ????????????while(j?>?i)??
  • ????????????????t1.a[j--]?+=?MAXN;??
  • ????????????t1.a[i]?+=?MAXN?+?1?-?t2.a[i];???
  • ????????}???
  • ????????else??
  • ????????????t1.a[i]?-=?t2.a[i];??
  • ????}??
  • ????t1.len?=?big;??
  • ????while(t1.a[t1.len?-?1]?==?0?&&?t1.len?>?1)??
  • ????{??
  • ????????t1.len--;???
  • ????????big--;??
  • ????}??
  • ????if(flag)??
  • ????????t1.a[big-1]=0-t1.a[big-1];??
  • ????return?t1;???
  • }???
  • ??
  • BigNum?BigNum::operator*(const?BigNum?&?T)?const???//兩個大數(shù)之間的相乘運算???
  • {???
  • ????BigNum?ret;???
  • ????int?i,j,up;???
  • ????int?temp,temp1;?????
  • ????for(i?=?0?;?i?<?len?;?i++)??
  • ????{???
  • ????????up?=?0;???
  • ????????for(j?=?0?;?j?<?T.len?;?j++)??
  • ????????{???
  • ????????????temp?=?a[i]?*?T.a[j]?+?ret.a[i?+?j]?+?up;???
  • ????????????if(temp?>?MAXN)??
  • ????????????{???
  • ????????????????temp1?=?temp?-?temp?/?(MAXN?+?1)?*?(MAXN?+?1);???
  • ????????????????up?=?temp?/?(MAXN?+?1);???
  • ????????????????ret.a[i?+?j]?=?temp1;???
  • ????????????}???
  • ????????????else??
  • ????????????{???
  • ????????????????up?=?0;???
  • ????????????????ret.a[i?+?j]?=?temp;???
  • ????????????}???
  • ????????}???
  • ????????if(up?!=?0)???
  • ????????????ret.a[i?+?j]?=?up;???
  • ????}???
  • ????ret.len?=?i?+?j;???
  • ????while(ret.a[ret.len?-?1]?==?0?&&?ret.len?>?1)??
  • ????????ret.len--;???
  • ????return?ret;???
  • }???
  • BigNum?BigNum::operator/(const?int?&?b)?const???//大數(shù)對一個整數(shù)進行相除運算??
  • {???
  • ????BigNum?ret;???
  • ????int?i,down?=?0;?????
  • ????for(i?=?len?-?1?;?i?>=?0?;?i--)??
  • ????{???
  • ????????ret.a[i]?=?(a[i]?+?down?*?(MAXN?+?1))?/?b;???
  • ????????down?=?a[i]?+?down?*?(MAXN?+?1)?-?ret.a[i]?*?b;???
  • ????}???
  • ????ret.len?=?len;???
  • ????while(ret.a[ret.len?-?1]?==?0?&&?ret.len?>?1)??
  • ????????ret.len--;???
  • ????return?ret;???
  • }??
  • int?BigNum::operator?%(const?int?&?b)?const????//大數(shù)對一個int類型的變量進行取模運算??????
  • {??
  • ????int?i,d=0;??
  • ????for?(i?=?len-1;?i>=0;?i--)??
  • ????{??
  • ????????d?=?((d?*?(MAXN+1))%?b?+?a[i])%?b;????
  • ????}??
  • ????return?d;??
  • }??
  • BigNum?BigNum::operator^(const?int?&?n)?const????//大數(shù)的n次方運算??
  • {??
  • ????BigNum?t,ret(1);??
  • ????int?i;??
  • ????if(n<0)??
  • ????????exit(-1);??
  • ????if(n==0)??
  • ????????return?1;??
  • ????if(n==1)??
  • ????????return?*this;??
  • ????int?m=n;??
  • ????while(m>1)??
  • ????{??
  • ????????t=*this;??
  • ????????for(?i=1;i<<1<=m;i<<=1)??
  • ????????{??
  • ????????????t=t*t;??
  • ????????}??
  • ????????m-=i;??
  • ????????ret=ret*t;??
  • ????????if(m==1)??
  • ????????????ret=ret*(*this);??
  • ????}??
  • ????return?ret;??
  • }??
  • bool?BigNum::operator>(const?BigNum?&?T)?const???//大數(shù)和另一個大數(shù)的大小比較??
  • {???
  • ????int?ln;???
  • ????if(len?>?T.len)??
  • ????????return?true;???
  • ????else?if(len?==?T.len)??
  • ????{???
  • ????????ln?=?len?-?1;???
  • ????????while(a[ln]?==?T.a[ln]?&&?ln?>=?0)??
  • ????????????ln--;???
  • ????????if(ln?>=?0?&&?a[ln]?>?T.a[ln])??
  • ????????????return?true;???
  • ????????else??
  • ????????????return?false;???
  • ????}???
  • ????else??
  • ????????return?false;???
  • }??
  • bool?BigNum::operator?>(const?int?&?t)?const????//大數(shù)和一個int類型的變量的大小比較??
  • {??
  • ????BigNum?b(t);??
  • ????return?*this>b;??
  • }??
  • ??
  • void?BigNum::print()????//輸出大數(shù)??
  • {???
  • ????int?i;?????
  • ????cout?<<?a[len?-?1];???
  • ????for(i?=?len?-?2?;?i?>=?0?;?i--)??
  • ????{???
  • ????????cout.width(DLEN);???
  • ????????cout.fill('0');???
  • ????????cout?<<?a[i];???
  • ????}???
  • ????cout?<<?endl;??
  • }??
  • int?main(void)??
  • {??
  • ????int?i,n;??
  • ????BigNum?x[101];??????//定義大數(shù)的對象數(shù)組??
  • ????x[0]=1;??
  • ????for(i=1;i<101;i++)??
  • ????????x[i]=x[i-1]*(4*i-2)/(i+1);??
  • ????while(scanf("%d",&n)==1?&&?n!=-1)??
  • ????{??
  • ????????x[n].print();??
  • ????}??
  • }??
  • 總結

    以上是生活随笔為你收集整理的c++ 大数类 大数模板的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。