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

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

大数模板的代码如下:

[cpp] view plaincopy
  1. #include<iostream>
  2. #include<string>
  3. #include<iomanip>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 9999
  7. #define MAXSIZE 10
  8. #define DLEN 4
  9. class BigNum
  10. {
  11. private:
  12. int a[500];    //可以控制大数的位数
  13. int len;       //大数长度
  14. public:
  15. BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
  16. BigNum(const int);       //将一个int类型的变量转化为大数
  17. BigNum(const char*);     //将一个字符串类型的变量转化为大数
  18. BigNum(const BigNum &);  //拷贝构造函数
  19. BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
  20. friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
  21. friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符
  22. BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
  23. BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
  24. BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
  25. BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
  26. BigNum operator^(const int  &) const;    //大数的n次方运算
  27. int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
  28. bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
  29. bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
  30. void print();       //输出大数
  31. };
  32. BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
  33. {
  34. int c,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(const char*s)     //将一个字符串类型的变量转化为大数
  46. {
  47. int t,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(int j=k;j<=i;j++)
  61. t=t*10+s[j]-'0';
  62. a[index++]=t;
  63. }
  64. }
  65. BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
  66. {
  67. int i;
  68. memset(a,0,sizeof(a));
  69. for(i = 0 ; i < len ; i++)
  70. a[i] = T.a[i];
  71. }
  72. BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
  73. {
  74. int i;
  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. char ch[MAXSIZE*4];
  84. int i = -1;
  85. in>>ch;
  86. int l=strlen(ch);
  87. int count=0,sum=0;
  88. for(i=l-1;i>=0;)
  89. {
  90. sum = 0;
  91. int t=1;
  92. for(int j=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. return in;
  101. }
  102. ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
  103. {
  104. int i;
  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. return out;
  113. }
  114. BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
  115. {
  116. BigNum t(*this);
  117. int i,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. return t;
  133. }
  134. BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
  135. {
  136. int i,j,big;
  137. bool flag;
  138. BigNum t1,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[t1.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. return t1;
  176. }
  177. BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
  178. {
  179. BigNum ret;
  180. int i,j,up;
  181. int temp,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. return ret;
  207. }
  208. BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
  209. {
  210. BigNum ret;
  211. int i,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. return ret;
  221. }
  222. int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
  223. {
  224. int i,d=0;
  225. for (i = len-1; i>=0; i--)
  226. {
  227. d = ((d * (MAXN+1))% b + a[i])% b;
  228. }
  229. return d;
  230. }
  231. BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
  232. {
  233. BigNum t,ret(1);
  234. int i;
  235. if(n<0)
  236. exit(-1);
  237. if(n==0)
  238. return 1;
  239. if(n==1)
  240. return *this;
  241. int m=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. return ret;
  255. }
  256. bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
  257. {
  258. int ln;
  259. if(len > T.len)
  260. return true;
  261. else if(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. return true;
  268. else
  269. return false;
  270. }
  271. else
  272. return false;
  273. }
  274. bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
  275. {
  276. BigNum b(t);
  277. return *this>b;
  278. }
  279. void BigNum::print()    //输出大数
  280. {
  281. int i;
  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. int main(void)
  292. {
  293. int i,n;
  294. BigNum x[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++ 大数类 大数模板相关推荐

  1. Java 大数类BigInteger与BigDecimal详细介绍(配蓝桥杯例题讲解)

    文章目录 1.基本函数 1.1 java.math.BigInteger.valueOf(long val) 2.运算法则 2.1 基本运算 2.2 compareTo(BigInteger othe ...

  2. java取模多位数_JAVA大数类—基础操作(加减乘除、取模、四舍五入、设置保留位数)...

    当基础数据类型长度无法满足需求时可以使用大数类 构造方法接受字符串为参数 1 BigInteger bInt = new BigInteger("123123");2 BigDec ...

  3. java 向上舍入_介绍Java的大数类(BigDecimal)和八种舍入模式

    1.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 1 ...

  4. java 大数实现_Java中的大数类简单实现

    Java中的大数类简单实现 Java中的大数还是挺好用,而且很方便,所以将其罗列如下,以备使用 import java.math.*; import java.util.*; //基本使用如下: x ...

  5. 常用类 (三) ----- BigDecimal和BigInteger大数类

    相关文章: <常用类 (一) ----- Arrays数组工具类> <常用类 (二) ----- Math类> <常用类 (三) ----- BigDecimal和Big ...

  6. 探索C/C++大数快(自然数)模板

    本文fcbruce个人原创整理.转载请注明出处http://blog.csdn.net/u012965890/article/details/40432511,谢谢. 我们知道在C/C++中int型可 ...

  7. 探寻C/C++中更快的大数(自然数集)模板

    本文系fcbruce个人原创整理,转载请注明出处http://blog.csdn.net/u012965890/article/details/40432511,谢谢! 我们知道在C/C++中int型 ...

  8. java大数类阶乘_Java中的大数阶乘

    java大数类阶乘 It is not possible to store factorial for large number like 50 into inbuilt data types lik ...

  9. 刷题常用之大数类、数学类

    一.前言 数学和大数类都是我们刷题比较常用的类,在笔试的时候两个类都可以用,但是在面试的时候尽量不要用大数类,因为大数类是java语言特有的(虽然有很多语言也有大数,但是不是所有语言都有大数,比如c+ ...

最新文章

  1. ffmpeg 常用命令
  2. Linux02-帮助手册
  3. GsonBuilder
  4. 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题
  5. 2021年度最佳开源软件榜单出炉!
  6. 线性代数 —— 矩阵的行列式
  7. css实现发光的input输入框
  8. 降低成本是永恒的追求(xamarin)
  9. 基于JAVA+Servlet+JSP+MYSQL的学生卡消费统计管理系统
  10. 5901和5909在P570中的功用
  11. 小程序开发:python sanic 实现小程序登录注册
  12. 【运筹学】匈牙利法 ( 匈牙利法示例 )
  13. 大学计算机课是绩点课吗,选修课是什么意思 选修课成绩算入绩点吗
  14. Meebo 和 GMail + Talk 等 WebIM 的实现方式
  15. wifi6 feature 详解
  16. python实现mysql多条件查询筛选功能
  17. 2022-2027年中国微创介入医疗器械市场竞争态势及行业投资前景预测报告
  18. 用计算机打一闪一闪亮晶晶,一闪一闪亮晶晶 我去!RGB轴机械键盘灯光玩法亮瞎人...
  19. 用ASP.NET建立一个在线RSS新闻聚合器
  20. Linux系统简介与深度解析

热门文章

  1. 【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 )
  2. 【Android 进程保活】oom_adj 值 ( 简介 | 查询进程 PID | 根据进程 PID 查询 oom_adj 值 )
  3. 【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
  4. 【Netty】Netty 入门案例分析 ( Netty 线程模型 | Netty 案例需求 | IntelliJ IDEA 项目导入 Netty 开发库 )
  5. 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)
  6. Test on 11/14/2016
  7. Mac下Jenkins+SVN+Xcode构建持续
  8. 15-07-15 数据库基础
  9. SQL2000输入的值与数据类型不一致,或者此值与列的长度不一致“
  10. 【position也可以很复杂】当弹出层遇上了鼠标定位(下)