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

  使用时直接 BigNum a,b,c; 可定义大数直接进行运算

C++大数运算模板的更多相关文章

  1. java的大数运算模板

    import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(S ...

  2. 大数运算(python2)

    偶然又遇到了一道大数题,据说python大数运算好屌,试了一发,果然方便-1 a = int( raw_input() ); //注意这里是按行读入的,即每行只读一个数 b = int( raw_in ...

  3. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

  4. [PKU2389]Bull Math (大数运算)

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  5. hdu_1041(Computer Transformation) 大数加法模板+找规律

    Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  6. java 大数运算[转]

    用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...

  7. A+B大数运算

    基础加法大数运算: [https://vjudge.net/problem/HDU-1002] 题目: 输入两个长度不超过1000的整数求出sum. 思路: 由于数字很大不能直接加,用字符串形式输入, ...

  8. HOJ 2148&POJ 2680(DP递推,加大数运算)

    Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...

  9. 九度OJ 1051:数字阶梯求和 (大数运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6718 解决:2280 题目描述: 给定a和n,计算a+aa+aaa+a...a(n个a)的和. 输入: 测试数据有多组,输入a,n(1&l ...

随机推荐

  1. 生活中需要一台mac本子

    用了好多年的windows系统,各种快捷键玩得飞起.当时对mac笔记本的印象就是. mac本子好高大上,搞设计的人才会去用的.(这个也是我听其他人说的) 在当时公司搞IOS开发的人中,面对这个高大上的 ...

  2. navicat 链接阿里云服务器数据库报80070007 的错误

    navicat用ssh跳转登录mysql连接时报: 80070007: SSH Tunnel: Server does not support diffie-hellman-group1-sha1 f ...

  3. UOJ#470. 【ZJOI2019】语言 虚树,线段树合并

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两 ...

  4. CF1207题解

    D 全排列减去坏序列 坏序列分三种,容斥一下就好了 E 比较有意思 \(A=_{i=1}^{100}\{i\},B=_{i=1}^{100}\{i\cdot 2^7\}\),所以\(A_i~xor~ ...

  5. Python 之pyinstaller模块打包成exe文件

    一.安装pyinstaller pip install pyinstaller 二.下载安装pyinstaler运行时所需要的windows扩展pywin32 https://github.com/m ...

  6. K8S中POD节点状态ContainerCreating原因排查

    现象: # kubectl get pods -n kube-system |grep dashboard kubernetes-dashboard-6685cb584f-dqkwk 0/1 Cont ...

  7. 数据结构Java版之二叉查找树(七)

    二叉查找树(BST : BInary Search Tree) 二叉查找树的性质: 1.每一个元素有一个键值 2.左子树的键值都小于根节点的键值 3.右子树的键值都大于根节点的键值 4.左右子树都是二 ...

  8. 优雅地使用eruda在移动端上调试网页

    注:本文有一小部分截图为桌面端,但所有内容都亲测在移动端上可用. 你曾否在洛谷上用<F12>把错的数据点改成AC?是否有过自己尝试搭建网站,在移动端上js代码运行出错?如果你的回答是肯定的 ...

  9. 团队作业-Alpha(1/4)

    队名:软工9组 组长博客: https://www.cnblogs.com/cmlei/ 作业博客: 组员进度 ● 组员一(组长) 陈明磊 ○过去两天完成了哪些任务 ●文字/口头描述 初步学习flas ...

  10. Software Project Management_JUnit && Maven

    Task1: Develop the project “HelloWorld” -A .java program: Just print out “Hello” + your name; -A tes ...