今天无意间看到一个很好的大数模板,能算加、减、乘、除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减。我借用了一下:(作过少许代码上的精简)

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<algorithm>
  5. #include<iostream>
  6. using namespace std;
  7.  
  8. const int maxn = ;
  9.  
  10. struct bign{
  11. int len, s[maxn];
  12. bign(){
  13. memset(s,,sizeof(s));
  14. len= ;
  15. }
  16. bign(int num) { *this = num; }
  17. bign(const char *num) { *this = num; }
  18. bign operator = (const int num){
  19. char s[maxn];
  20. sprintf(s,"%d",num);
  21. return *this = s;
  22. }
  23. bign operator = (const char *num){
  24. for(int i = ; num[i] && num[i] ==''; ++num) ;
  25. len = strlen(num);
  26. for(int i = ; i < len; ++i)
  27. s[i] = num[len--i] -'';
  28. return *this;
  29. }
  30. bign operator + (const bign &b) const {
  31. bign c;
  32. c.len = ;
  33. int maxlen = max(len, b.len);
  34. for(int i = , g = ; g || i < maxlen; ++i){ // g是进位
  35. int x = g;
  36. if(i < len) x += s[i];
  37. if(i < b.len) x += b.s[i];
  38. c.s[c.len++] = x % ;
  39. g = x / ;
  40. }
  41. return c;
  42. }
  43. bign operator += (const bign &b){
  44. return *this = *this + b;
  45. }
  46. void clean(){
  47. while(len > && !s[len-]) --len;
  48. }
  49. bign operator * (const bign &b) const {
  50. bign c;
  51. c.len = len + b.len;
  52.  
  53. for(int i = ; i < len; ++i)
  54. for(int j = ; j < b.len; ++j)
  55. c.s[i+j] += s[i] * b.s[j];
  56.  
  57. for(int i = ; i < c.len; ++i){
  58. c.s[i+] += c.s[i]/;
  59. c.s[i] %= ;
  60. }
  61. c.clean();
  62. return c;
  63. }
  64. bign operator *= (const bign &b){
  65. return *this = *this * b;
  66. }
  67. bign operator -(const bign &b) const {
  68. bign c;
  69. c.len = ;
  70. for(int i = , g = ; i < len; ++i){ //此时的 g是退位
  71. int x = s[i]- g;
  72. if(i < b.len) x -= b.s[i];
  73. if(x >= ) g = ;
  74. else {
  75. g = ;
  76. x += ;
  77. }
  78. c.s[c.len++] = x;
  79. }
  80. c.clean();
  81. return c;
  82. }
  83. bign operator -= (const bign &b){
  84. return *this = *this - b;
  85. }
  86. bign operator / (const bign &b) const {
  87. bign c, f = ;
  88. for(int i = len-; i >= ; --i){
  89. f *= ;
  90. f.s[] = s[i];
  91. while(f >= b){
  92. f -= b;
  93. ++c.s[i];
  94. }
  95. }
  96. c.len = len;
  97. c.clean();
  98. return c;
  99. }
  100. bign operator /= (const bign &b){
  101. return *this = *this / b;
  102. }
  103. bign operator % (const bign &b) const {
  104. bign r = *this / b;
  105. return *this- r*b;
  106. }
  107. bign operator %= (const bign &b){
  108. return *this = *this % b;
  109. }
  110. bool operator < (const bign &b) const {
  111. if(len != b.len) return len < b.len;
  112. for(int i= len-; i>=; --i)
  113. if(s[i] != b.s[i]) return s[i] < b.s[i];
  114. return ;
  115. }
  116. bool operator > (const bign &b) const {
  117. if(len != b.len) return len > b.len;
  118. for(int i = len-; i >= ; --i)
  119. if(s[i] != b.s[i]) return s[i] > b.s[i];
  120. return ;
  121. }
  122. bool operator == (const bign &b) const {
  123. return !(*this < b || *this > b);
  124. }
  125. bool operator != (const bign &b) const {
  126. return !(*this == b);
  127. }
  128. bool operator <= (const bign &b) const {
  129. return *this < b || *this == b;
  130. }
  131. bool operator >= (const bign &b) const {
  132. return *this > b || *this == b;
  133. }
  134. string str() const {
  135. string res = "";
  136. for(int i = ; i < len; ++i)
  137. res = char(s[i]+'') + res; //这里一定不能掉乱 +的顺序!
  138. return res;
  139. }
  140. };
  141.  
  142. istream& operator >> (istream &in, bign &x){
  143. string s;
  144. in >> s;
  145. x = s.c_str();
  146. return in;
  147. }
  148.  
  149. ostream& operator << (ostream &out, const bign &x){
  150. out << x.str();
  151. return out;
  152. }
  153.  
  154. int main()
  155. {
  156. bign a,b,c,d,e,f,g;
  157. while(cin>>a>>b)
  158. {
  159. a.clean();
  160. b.clean();
  161. c = a+b;
  162. d = a-b;
  163. e = a*b;
  164. f = a/b;
  165. g = a%b;
  166. cout<<"a+b = "<<c<<endl;
  167. cout<<"a-b = "<<d<<endl;
  168. cout<<"a*b = "<<e<<endl;
  169. cout<<"a/b = "<<f<<endl;
  170. cout<<"a%b = "<<g<<endl;
  171. cout<<(a==b? "a = b":"a != b")<<endl;
  172. }
  173. return ;
  174. }

  在此感谢原博客的模板提供: bign类C++高精度模板

bignum 大数模板的更多相关文章

  1. hdu 5429 Geometric Progression(存个大数模板)

    Problem Description Determine whether a sequence is a Geometric progression or not. In mathematics, ...

  2. 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...

  3. hdu1042(大数模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 在网上找了个大数模板方便以后用得到. #include<iostream> #inc ...

  4. 大数模板 poj3982

    1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就 ...

  5. Hdu 4762 网络赛 高精度大数模板+概率

    注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...

  6. vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

    P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...

  7. c++大数模板

    自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...

  8. ACM大数模板(支持正负整数)

    之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大 ...

  9. 大数模板 (C ++)

    上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. //可以处理字符串前导零 #i ...

随机推荐

  1. [转]在iOS项目中使用CorePlot框架

    转载地址:http://blog.csdn.net/llfjfz/article/details/7849190#comments Core Plot是OS X和IOS下的一个开源图形库,它提供数据的 ...

  2. Poj(3686),最小权匹配,多重匹配,KM

    题目链接 The Windy's | Time Limit: 5000MS | Memory Limit: 65536K | | Total Submissions: 4939 | Accepted: ...

  3. Robotium中定位Android客户端疑难元素

    对于没有id,没有text,只有一个图标的疑难元素(ImageView),应该如何定位呢?拿人人网个人主页的设置按钮举例: 我最终是通过定位页面上可以定位到的其他元素,然后通过其他元素与疑难元素相对坐 ...

  4. Reflection实现通用增删改

    新增 /// <summary> /// 通用新增方法 /// </summary> /// <param name="arr">一行数据封装的 ...

  5. PHP比较运算!=和!==

    PHP!=和!==的区别 !==是指绝对不等于,比如,$a = 3, $b="3" 那么,$a!==$b成立,可是$a!=$b不成立:

  6. JavaScript的学习

    学习了一段时间了,oop 的JavaScript .但是理解了还不是很深入,所以,决定.通过写博客的方式来,加深JavaScript的程度.2016的目标: 第一阶段:oop的JavaScript 第 ...

  7. 2016年11月3日 星期四 --出埃及记 Exodus 19:19

    2016年11月3日 星期四 --出埃及记 Exodus 19:19 and the sound of the trumpet grew louder and louder. Then Moses s ...

  8. P2679 子串

    http://www.luogu.org/problem/show?pid=2679 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后 ...

  9. UICollectionView 使用

    /** 初始化UICollectionView */ UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc ...

  10. centos7 安装 mariadb 的正确命令

    使用的是linode的centos7系统,安装mysql发现已经默认的是mariadb. 但是不管是使用linode官网说明还是百度搜索到的的根本安装方法无法安装成功. 总是提示这一句: ERROR  ...