`
v5browser
  • 浏览: 1136948 次
社区版块
存档分类
最新评论

C++大数模板

 
阅读更多

分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。

并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题。。http://acm.hdu.edu.cn/showproblem.php?pid=1134

大数模板的代码如下:

  1. #include<iostream>
  2. #include<string>
  3. #include<iomanip>
  4. #include<algorithm>
  5. usingnamespacestd;
  6. #defineMAXN9999
  7. #defineMAXSIZE10
  8. #defineDLEN4
  9. classBigNum
  10. {
  11. private:
  12. inta[500];//可以控制大数的位数
  13. intlen;//大数长度
  14. public:
  15. BigNum(){len=1;memset(a,0,sizeof(a));}//构造函数
  16. BigNum(constint);//将一个int类型的变量转化为大数
  17. BigNum(constchar*);//将一个字符串类型的变量转化为大数
  18. BigNum(constBigNum&);//拷贝构造函数
  19. BigNum&operator=(constBigNum&);//重载赋值运算符,大数之间进行赋值运算
  20. friendistream&operator>>(istream&,BigNum&);//重载输入运算符
  21. friendostream&operator<<(ostream&,BigNum&);//重载输出运算符
  22. BigNumoperator+(constBigNum&)const;//重载加法运算符,两个大数之间的相加运算
  23. BigNumoperator-(constBigNum&)const;//重载减法运算符,两个大数之间的相减运算
  24. BigNumoperator*(constBigNum&)const;//重载乘法运算符,两个大数之间的相乘运算
  25. BigNumoperator/(constint&)const;//重载除法运算符,大数对一个整数进行相除运算
  26. BigNumoperator^(constint&)const;//大数的n次方运算
  27. intoperator%(constint&)const;//大数对一个int类型的变量进行取模运算
  28. booloperator>(constBigNum&T)const;//大数和另一个大数的大小比较
  29. booloperator>(constint&t)const;//大数和一个int类型的变量的大小比较
  30. voidprint();//输出大数
  31. };
  32. BigNum::BigNum(constintb)//将一个int类型的变量转化为大数
  33. {
  34. intc,d=b;
  35. len=0;
  36. memset(a,0,sizeof(a));
  37. while(d>MAXN)
  38. {
  39. c=d-(d/(MAXN+1))*(MAXN+1);
  40. d=d/(MAXN+1);
  41. a[len++]=c;
  42. }
  43. a[len++]=d;
  44. }
  45. BigNum::BigNum(constchar*s)//将一个字符串类型的变量转化为大数
  46. {
  47. intt,k,index,l,i;
  48. memset(a,0,sizeof(a));
  49. l=strlen(s);
  50. len=l/DLEN;
  51. if(l%DLEN)
  52. len++;
  53. index=0;
  54. for(i=l-1;i>=0;i-=DLEN)
  55. {
  56. t=0;
  57. k=i-DLEN+1;
  58. if(k<0)
  59. k=0;
  60. for(intj=k;j<=i;j++)
  61. t=t*10+s[j]-'0';
  62. a[index++]=t;
  63. }
  64. }
  65. BigNum::BigNum(constBigNum&T):len(T.len)//拷贝构造函数
  66. {
  67. inti;
  68. memset(a,0,sizeof(a));
  69. for(i=0;i<len;i++)
  70. a[i]=T.a[i];
  71. }
  72. BigNum&BigNum::operator=(constBigNum&n)//重载赋值运算符,大数之间进行赋值运算
  73. {
  74. inti;
  75. len=n.len;
  76. memset(a,0,sizeof(a));
  77. for(i=0;i<len;i++)
  78. a[i]=n.a[i];
  79. return*this;
  80. }
  81. istream&operator>>(istream&in,BigNum&b)//重载输入运算符
  82. {
  83. charch[MAXSIZE*4];
  84. inti=-1;
  85. in>>ch;
  86. intl=strlen(ch);
  87. intcount=0,sum=0;
  88. for(i=l-1;i>=0;)
  89. {
  90. sum=0;
  91. intt=1;
  92. for(intj=0;j<4&&i>=0;j++,i--,t*=10)
  93. {
  94. sum+=(ch[i]-'0')*t;
  95. }
  96. b.a[count]=sum;
  97. count++;
  98. }
  99. b.len=count++;
  100. returnin;
  101. }
  102. ostream&operator<<(ostream&out,BigNum&b)//重载输出运算符
  103. {
  104. inti;
  105. cout<<b.a[b.len-1];
  106. for(i=b.len-2;i>=0;i--)
  107. {
  108. cout.width(DLEN);
  109. cout.fill('0');
  110. cout<<b.a[i];
  111. }
  112. returnout;
  113. }
  114. BigNumBigNum::operator+(constBigNum&T)const//两个大数之间的相加运算
  115. {
  116. BigNumt(*this);
  117. inti,big;//位数
  118. big=T.len>len?T.len:len;
  119. for(i=0;i<big;i++)
  120. {
  121. t.a[i]+=T.a[i];
  122. if(t.a[i]>MAXN)
  123. {
  124. t.a[i+1]++;
  125. t.a[i]-=MAXN+1;
  126. }
  127. }
  128. if(t.a[big]!=0)
  129. t.len=big+1;
  130. else
  131. t.len=big;
  132. returnt;
  133. }
  134. BigNumBigNum::operator-(constBigNum&T)const//两个大数之间的相减运算
  135. {
  136. inti,j,big;
  137. boolflag;
  138. BigNumt1,t2;
  139. if(*this>T)
  140. {
  141. t1=*this;
  142. t2=T;
  143. flag=0;
  144. }
  145. else
  146. {
  147. t1=T;
  148. t2=*this;
  149. flag=1;
  150. }
  151. big=t1.len;
  152. for(i=0;i<big;i++)
  153. {
  154. if(t1.a[i]<t2.a[i])
  155. {
  156. j=i+1;
  157. while(t1.a[j]==0)
  158. j++;
  159. t1.a[j--]--;
  160. while(j>i)
  161. t1.a[j--]+=MAXN;
  162. t1.a[i]+=MAXN+1-t2.a[i];
  163. }
  164. else
  165. t1.a[i]-=t2.a[i];
  166. }
  167. t1.len=big;
  168. while(t1.a[len-1]==0&&t1.len>1)
  169. {
  170. t1.len--;
  171. big--;
  172. }
  173. if(flag)
  174. t1.a[big-1]=0-t1.a[big-1];
  175. returnt1;
  176. }
  177. BigNumBigNum::operator*(constBigNum&T)const//两个大数之间的相乘运算
  178. {
  179. BigNumret;
  180. inti,j,up;
  181. inttemp,temp1;
  182. for(i=0;i<len;i++)
  183. {
  184. up=0;
  185. for(j=0;j<T.len;j++)
  186. {
  187. temp=a[i]*T.a[j]+ret.a[i+j]+up;
  188. if(temp>MAXN)
  189. {
  190. temp1=temp-temp/(MAXN+1)*(MAXN+1);
  191. up=temp/(MAXN+1);
  192. ret.a[i+j]=temp1;
  193. }
  194. else
  195. {
  196. up=0;
  197. ret.a[i+j]=temp;
  198. }
  199. }
  200. if(up!=0)
  201. ret.a[i+j]=up;
  202. }
  203. ret.len=i+j;
  204. while(ret.a[ret.len-1]==0&&ret.len>1)
  205. ret.len--;
  206. returnret;
  207. }
  208. BigNumBigNum::operator/(constint&b)const//大数对一个整数进行相除运算
  209. {
  210. BigNumret;
  211. inti,down=0;
  212. for(i=len-1;i>=0;i--)
  213. {
  214. ret.a[i]=(a[i]+down*(MAXN+1))/b;
  215. down=a[i]+down*(MAXN+1)-ret.a[i]*b;
  216. }
  217. ret.len=len;
  218. while(ret.a[ret.len-1]==0&&ret.len>1)
  219. ret.len--;
  220. returnret;
  221. }
  222. intBigNum::operator%(constint&b)const//大数对一个int类型的变量进行取模运算
  223. {
  224. inti,d=0;
  225. for(i=len-1;i>=0;i--)
  226. {
  227. d=((d*(MAXN+1))%b+a[i])%b;
  228. }
  229. returnd;
  230. }
  231. BigNumBigNum::operator^(constint&n)const//大数的n次方运算
  232. {
  233. BigNumt,ret(1);
  234. inti;
  235. if(n<0)
  236. exit(-1);
  237. if(n==0)
  238. return1;
  239. if(n==1)
  240. return*this;
  241. intm=n;
  242. while(m>1)
  243. {
  244. t=*this;
  245. for(i=1;i<<1<=m;i<<=1)
  246. {
  247. t=t*t;
  248. }
  249. m-=i;
  250. ret=ret*t;
  251. if(m==1)
  252. ret=ret*(*this);
  253. }
  254. returnret;
  255. }
  256. boolBigNum::operator>(constBigNum&T)const//大数和另一个大数的大小比较
  257. {
  258. intln;
  259. if(len>T.len)
  260. returntrue;
  261. elseif(len==T.len)
  262. {
  263. ln=len-1;
  264. while(a[ln]==T.a[ln]&&ln>=0)
  265. ln--;
  266. if(ln>=0&&a[ln]>T.a[ln])
  267. returntrue;
  268. else
  269. returnfalse;
  270. }
  271. else
  272. returnfalse;
  273. }
  274. boolBigNum::operator>(constint&t)const//大数和一个int类型的变量的大小比较
  275. {
  276. BigNumb(t);
  277. return*this>b;
  278. }
  279. voidBigNum::print()//输出大数
  280. {
  281. inti;
  282. cout<<a[len-1];
  283. for(i=len-2;i>=0;i--)
  284. {
  285. cout.width(DLEN);
  286. cout.fill('0');
  287. cout<<a[i];
  288. }
  289. cout<<endl;
  290. }
  291. intmain(void)
  292. {
  293. inti,n;
  294. BigNumx[101];//定义大数的对象数组
  295. x[0]=1;
  296. for(i=1;i<101;i++)
  297. x[i]=x[i-1]*(4*i-2)/(i+1);
  298. while(scanf("%d",&n)==1&&n!=-1)
  299. {
  300. x[n].print();
  301. }
  302. }


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics