链接:http://www.voidcn.com/article/p-xjnjfxxq-vd.html
分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。
???????? 并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题。。http://acm.hdu.edu.cn/showproblem.php?pid=1134
大数模板的代码如下:
- #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];??????
- ????int?len;?????????
- public:???
- ????BigNum(){?len?=?1;memset(a,sizeof(a));?}?????
- ????BigNum(const?int);?????????
- ????BigNum(char*);???????
- const?BigNum?&);????
- ????BigNum?&operator=(const?BigNum?&);?????
- ????friend?istream&?operator>>(istream&,??BigNum&);?????
- ????friend?ostream&?operator<<(ostream&,0); background-color:inherit">//重载输出运算符??
- ??
- ????BigNum?operator+(const?BigNum?&)?const;?????
- ????BigNum?operator-(//重载减法运算符,两个大数之间的相减运算???
- ????BigNum?operator*(//重载乘法运算符,两个大数之间的相乘运算???
- ????BigNum?operator/(int???&)?const;??????
- ????BigNum?operator^(int??&)?//大数的n次方运算??
- int????operator%(//大数对一个int类型的变量进行取模运算??????
- bool???operator>(const?BigNum?&?T)//大数和另一个大数的大小比较??
- int?&?t)const;????????
- void?print();?????????
- };???
- BigNum::BigNum(int?b)?????
- int?c,d?=?b;??
- ????len?=?0;??
- ????memset(a,153); font-weight:bold; background-color:inherit">sizeof(a));??
- while(d?>?MAXN)??
- ????{??
- ????????c?=?d?-?(d?/?(MAXN?+?1))?*?(MAXN?+?1);???
- ????????d?=?d?/?(MAXN?+?1);??
- ????????a[len++]?=?c;??
- ????}??
- ????a[len++]?=?d;??
- }??
- BigNum::BigNum(char*s)?????
- int?t,k,index,l,i;??
- ????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;??
- ????}??
- const?BigNum?&?T)?:?len(T.len)????
- int?i;???
- sizeof(a));???
- for(i?=?0?;?i?<?len?;?i++)??
- ????????a[i]?=?T.a[i];???
- }???
- BigNum?&?BigNum::operator=(const?BigNum?&?n)?????
- {??
- int?i;??
- ????len?=?n.len;??
- for(i?=?0?;?i?<?len?;?i++)???
- ????????a[i]?=?n.a[i];???
- return?*this;???
- istream&?operator>>(istream?&?in,??BigNum?&?b)????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;??
- 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?????
- ????BigNum?t(*this);??
- int?i,big;????????
- ????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-(//两个大数之间的相减运算???
- {????
- 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];???
- ????????}???
- ????????????t1.a[i]?-=?t2.a[i];??
- ????t1.len?=?big;??
- while(t1.a[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*(//两个大数之间的相乘运算???
- ????BigNum?ret;???
- int?temp,temp1;?????
- ????????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;???
- ????????????}???
- ????????????????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/(int?&?b)?//大数对一个整数进行相除运算??
- ????BigNum?ret;???
- 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;???
- int?BigNum::operator?%(const??????
- for?(i?=?len-1;?i>=0;?i--)??
- ????????d?=?((d?*?(MAXN+1))%?b?+?a[i])%?b;????
- return?d;??
- BigNum?BigNum::operator^(int?&?n)?//大数的n次方运算??
- ????BigNum?t,ret(1);??
- int?i;??
- if(n<0)??
- ????????exit(-1);??
- if(n==0)??
- return?1;??
- if(n==1)??
- int?m=n;??
- while(m>1)??
- ????????t=*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>(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])??
- true;???
- false;???
- false;???
- bool?BigNum::operator?>(int?&?t)?//大数和一个int类型的变量的大小比较??
- ????BigNum?b(t);??
- this>b;??
- void?BigNum::print()??????
- int?i;?????
- ????cout?<<?a[len?-?1];???
- for(i?=?len?-?2?;?i?>=?0?;?i--)??
- ????????cout?<<?a[i];???
- ????cout?<<?endl;??
- int?main(void)??
- ????BigNum?x[101];????????
- ????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();??
- }??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|