其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的。

其中高精度除法返回一对string,分别表示商和余数。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 100010;
  4. int a[maxn], b[maxn], res[maxn];
  5. string add(string s1, string s2) { // under condition: s1,s2>=0
  6. // 初始化部分
  7. int n = s1.length(), m = s2.length();
  8. for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
  9. for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
  10. int len = max(n, m) + 1;
  11. for (int i = n; i < len; i ++) a[i] = 0;
  12. for (int i = m; i < len; i ++) b[i] = 0;
  13. for (int i = 0; i < len; i ++) res[i] = 0;
  14. // 处理部分
  15. for (int i = 0; i < len; i ++) {
  16. res[i] += a[i] + b[i];
  17. if (res[i] >= 10) {
  18. res[i+1] += res[i] / 10;
  19. res[i] %= 10;
  20. }
  21. }
  22. // 返回部分
  23. int i = len-1;
  24. while (res[i] == 0 && i > 0) i --;
  25. string s = "";
  26. for (; i >= 0; i --) {
  27. char c = (char) (res[i] + '0');
  28. s += c;
  29. }
  30. return s;
  31. }
  32. string sub(string s1, string s2) { // under condition: s1>=s2>=0
  33. // 初始化部分
  34. int n = s1.length(), m = s2.length();
  35. for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
  36. for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
  37. int len = max(n, m);
  38. for (int i = n; i < len; i ++) a[i] = 0;
  39. for (int i = m; i < len; i ++) b[i] = 0;
  40. for (int i = 0; i < len; i ++) res[i] = 0;
  41. // 处理部分
  42. for (int i = 0; i < len; i ++) {
  43. res[i] += a[i] - b[i];
  44. if (res[i] < 0) {
  45. res[i+1] --;
  46. res[i] += 10;
  47. }
  48. }
  49. // 返回部分
  50. int i = len-1;
  51. while (res[i] == 0 && i > 0) i --;
  52. string s = "";
  53. for (; i >= 0; i --) {
  54. char c = (char) (res[i] + '0');
  55. s += c;
  56. }
  57. return s;
  58. }
  59. bool cmp(string s1, string s2) { // under condition: s1,s2 >= 0
  60. int n = s1.length(), m = s2.length();
  61. int i;
  62. for (i = 0; i < n-1 && s1[i] == '0'; i ++);
  63. s1 = s1.substr(i);
  64. for (i = 0; i < m-1 && s2[i] == '0'; i ++);
  65. s2 = s2.substr(i);
  66. if (s1.length() != s2.length()) return s1.length() < s2.length();
  67. return s1 < s2;
  68. }
  69. string Add(string s1, string s2) {
  70. if (s1[0] == '-' && s2[0] == '-') {
  71. return "-" + add(s1.substr(1), s2.substr(1));
  72. }
  73. else if (s1[0] == '-') {
  74. s1 = s1.substr(1);
  75. if (cmp(s1, s2) == true) {
  76. return sub(s2, s1);
  77. } else {
  78. return "-" + sub(s1, s2);
  79. }
  80. }
  81. else if (s2[0] == '-') {
  82. s2 = s2.substr(1);
  83. if (cmp(s1, s2) == true) {
  84. return "-" + sub(s2, s1);
  85. } else {
  86. return sub(s1, s2);
  87. }
  88. }
  89. else {
  90. return add(s1, s2);
  91. }
  92. }
  93. string Sub(string s1, string s2) {
  94. if (s2[0] == '-') {
  95. s2 = s2.substr(1);
  96. return Add(s1, s2);
  97. }
  98. else {
  99. return Add(s1, "-" + s2);
  100. }
  101. }
  102. string multi(string s1, string s2) { // under condition: s1,s2>=0
  103. // 初始化部分
  104. int n = s1.length(), m = s2.length();
  105. for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
  106. for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
  107. int len = n + m;
  108. for (int i = n; i < len; i ++) a[i] = 0;
  109. for (int i = m; i < len; i ++) b[i] = 0;
  110. for (int i = 0; i < len; i ++) res[i] = 0;
  111. // 处理部分
  112. for (int i = 0; i < n; i ++)
  113. for (int j = 0; j < m; j ++)
  114. res[i+j] += a[i] * b[j];
  115. for (int i = 0; i < len; i ++) {
  116. res[i+1] += res[i] / 10;
  117. res[i] %= 10;
  118. }
  119. // 返回部分
  120. int i = len-1;
  121. while (res[i] == 0 && i > 0) i --;
  122. string s = "";
  123. for (; i >= 0; i --) {
  124. char c = (char) (res[i] + '0');
  125. s += c;
  126. }
  127. return s;
  128. }
  129. pair<string, string> divide(string s1, string s2) { // under condition: s1>=0,s2>0
  130. string s = "", t = "";
  131. int n = s1.length(), m = s2.length();
  132. bool flag = false;
  133. for (int i = 0; i < n; i ++) {
  134. s += s1[i];
  135. int num = 0;
  136. while (cmp(s, s2) == false) {
  137. num ++;
  138. s = sub(s, s2);
  139. }
  140. if (num > 0) {
  141. flag = true;
  142. char c = (char)(num + '0');
  143. t += c;
  144. }
  145. else if (flag) {
  146. t += '0';
  147. }
  148. }
  149. if (t.length() == 0) t = "0";
  150. while (s[0] == '0' && s.length() > 1) s = s.substr(1);
  151. return make_pair(t, s);
  152. }
  153. string s1, s2;
  154. int main() {
  155. while (cin >> s1 >> s2) {
  156. cout << "add:\t" << Add(s1, s2) << endl;
  157. cout << "sub:\t" << Sub(s1, s2) << endl;
  158. cout << "multi:\t" << multi(s1, s2) << endl;
  159. pair<string, string> divide_pair = divide(s1, s2);
  160. cout << "divide:\t" << divide_pair.first << " ...... " << divide_pair.second << endl;
  161. }
  162. return 0;
  163. }

测试数据:

  1. 100 9
  2. add: 109
  3. sub: 91
  4. multi: 900
  5. divide: 11 ...... 1
  6. 1000000 87
  7. add: 1000087
  8. sub: 999913
  9. multi: 87000000
  10. divide: 11494 ...... 22

C++高精度加减乘除模板的更多相关文章

  1. ACM高精度加减乘除模板

    [转]#include <iostream> #include <string> using namespace std; inline int compare(string ...

  2. c++的正整数高精度加减乘除

    数值计算之高精度加减乘除 一.      高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主 ...

  3. C++高精度整数加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  4. H. GSS and Simple Math Problem 高精度乘法模板

    链接:https://www.nowcoder.com/acm/contest/104/G来源:牛客网 题目描述 Given n positive integers , your task is to ...

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

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

  6. 【高精度】模板 (C++)

    //n为长度 1.高精加 复杂度:O(n) #include<iostream> #include<cstring> #include<algorithm> usi ...

  7. 洛谷 P2142 高精度减法(模板)

    题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据 ...

  8. 大数高精度加减乘除 51nod 1005 大数加法

    1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...

  9. 高精度乘法模板(luogu1303)

    洛谷1303 //luogu1303,不压位的高精度乘法 #include <cstdio> #include <iostream> using namespace std; ...

随机推荐

  1. vagrant简介

    什么是vagrant? 简单理解,就是可以通过Vagrant这个工具管理虚拟机,比如说想创建一个centos环境的虚拟机,不需要安装系统这么麻烦,通过vagrant可以快速创建 官网地址:https: ...

  2. 跟我一起使用webpack给一个开源项目添加一个运行入口

    啦啦啦啦啦不要把webpack想的很高大上就放弃了探究的想法,其实webpack特别的平易近人,就是一个工具 今天看到了一个超级美丽的项目 你可以看到各种各样的口红色号,满屏的粉色,哇哇哇哇塞,美美哒 ...

  3. golang之if

    1.if语句 (1)if (2)if else (3)if esle ...else

  4. 配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景

    应用配置管理(Application Configuration Management,简称 ACM)是一款应用配置中心产品.基于ACM您可以在微服务.DevOps.大数据等场景下极大地减轻配置管理的 ...

  5. Thinkphp 不足之处

    1.报错机制 //控制器里面直接输出如下内容,代码不提示.TP报错机制已经开启 echo $aaaaaa; bbbbbbbbb; eco bbbbbbbb; 正常应该给出以下提示 Notice: Un ...

  6. Java 分页对象

    以前一直没有自己写过分页对象,自己模仿着写了一个分页对象,写完之后感觉也是挺简单的 package com.css.util; import java.io.Serializable;import j ...

  7. python进程间通信 queue pipe

    python进程间通信 1 python提供了多种进程通信的方式,主要Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信 1.1 Queue有两个方法: Put ...

  8. IDEA 创建文件夹总默认根节点问题解决

    上面是文件夹结构显示,如果勾掉,就是按层级显示,空目录不会自动折叠成一行 原文地址;https://blog.csdn.net/huangjunwei6/article/details/7150755 ...

  9. check constraints

    SELECT constraint_name, constraint_type, column_name, STATUSfrom user_constraints natural join user_ ...

  10. 带三角形下标的提示框(按钮button)

    HTML:<div class="leaflet-popup-content-wrapper"> <div class="leaflet-popup-c ...