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

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. }


分享到:
评论

相关推荐

    c++大数模板

    c++大数模板 内含各种大数操作 还可以自己设置数的长度

    c++大数模板,加减乘除阶乘求幂N进制

    以上就是关于"C++大数模板,加减乘除阶乘求幂N进制"的相关知识点。这些操作在密码学、分布式计算、金融计算等领域都有广泛应用。通过理解并掌握这些知识点,开发者可以编写高效且灵活的大数处理程序。

    C++大数模板。ACM必备

    处理大数的模板,C++大数模板。ACM必备

    C++高精度大数模板

    无论是简略版还是加强版,这两种C++大数模板都会涉及以下关键知识点: 1. **位数组表示**:大数通过数组存储,数组的每个元素代表一个位,最高位通常表示数值的符号。 2. **运算符重载**:为了方便使用,大数类...

    C++大数模板(推荐)

    C++大数模板是用于处理超出普通整型变量范围的大整数的一种编程技巧。在C++中,标准库并未提供内置的大数类型,因此需要自定义数据结构和运算方法来实现大数运算。本篇文章主要介绍了如何使用C++通过运算符重载来...

    大数模板(C++)大数加法、大数乘法、大数除法

    用C++写的重载的大数模板 大数加法、大数乘法、大数除法、大数减法 带有注释

    大数模板C++版 可直接套用

    本篇将详细解析标题为“大数模板C++版 可直接套用”的知识点,以及如何运用这个模板。 首先,大数模板的核心在于存储和表示大数。由于C++的内置类型无法满足需求,我们通常使用字符数组或向量来存储大数的每一位。...

    大数运算模板(C++)

    大数运算模板(C++) 大数运算模板是一个C++语言实现的大数运算库,用于处理大数的四则运算、平方根、求末尾0个数、求长度等操作。该模板只能处理正数的大数,包括int型的组合排列。下面是该模板的一些使用方法和...

    ACM C++ 大数计算模板

    我测试通过的大数计算模板,遇到一些简单题可以直接代入

    ACM大数模板(c/c++)

    ACM中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。

    C++ 实现大数阶乘的算法

    C++的`list()`模板是一种高效且灵活的数据结构,特别适合处理动态增长的序列,比如在计算大数阶乘时可能会遇到的情况。 首先,我们要理解阶乘的概念。阶乘是一个正整数n的乘积,表示为n!,其中1! = 1,2! = 2 × 1...

    大数相加通用模版

    《大数相加通用模板》这一主题正是针对此类需求,提供了一种高效、通用的解决方案,尤其适用于ACM竞赛中遇到超出标准数据类型范围的情况。 ### 大数相加的重要性 在计算机科学中,大数运算主要应用于密码学、金融...

    c++的大数运算可以实现基本运算

    以下是一些关于C++大数运算的基本知识点: 1. **数据结构设计**:大数通常以逆序存储,即从最低位(个位)到最高位(高位)。这样方便从低位开始进行逐位运算,类似于人类书写数字的习惯。例如,`std::vector&lt;int&gt; ...

    C++可正负大数类模板

    C++大整数类,支持正负,支持比较运算,加减乘自加自减自乘等操作。

    c++大数运算,重载运算符

    运算符已经重载,界面友好,在hdu上可以跑出0ms,也适合做acm模板

    C++ 大数A+B你懂得 数据结构.docx

    在这个C++程序中,我们...总的来说,这个程序展示了如何利用C++的类和模板机制来处理特定问题,以及如何实现大数相加的算法。在实际应用中,可以考虑使用更高效的数据结构(如大数库)或算法来处理更大规模的数值计算。

    用mfc做的具有图形界面的大数计算器

    本文将深入探讨一个使用MFC(Microsoft Foundation Classes)库和VC++(Visual C++)编写的能处理大数运算的计算器项目。这个计算器不仅实现了基本的算术运算,还特别针对大数进行了优化,可以处理超过普通整型或...

    C++ 大数A+B你懂得 数据结构.pdf

    这篇代码是关于使用C++实现大整数相加的程序,主要涉及数据结构、类模板以及大数运算。程序通过定义一个顺序列表(SeqList)类来存储大整数,并实现了大整数相加的功能。 首先,我们来看`SeqList`类,它是一个泛型...

    大数运算类(C++实现)(代码注释详细,运行main.cpp就行,内含有可直接执行的exe文件)

    如果有表意不明的地方请各位下载的用户私聊或者留言,看到之后必定会给详细回复(该大数运算类所用的数据结构:列表并非是用c++标准库的模板类,而是用作者手打的链表实现的)(压缩包内部有exe文件可以在Windows10...

Global site tag (gtag.js) - Google Analytics