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

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

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010; int a[maxn], b[maxn], res[maxn]; string add(string s1, string s2) { // under condition: s1,s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = max(n, m) + 1;
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < len; i ++) {
res[i] += a[i] + b[i];
if (res[i] >= 10) {
res[i+1] += res[i] / 10;
res[i] %= 10;
}
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
} string sub(string s1, string s2) { // under condition: s1>=s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = max(n, m);
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < len; i ++) {
res[i] += a[i] - b[i];
if (res[i] < 0) {
res[i+1] --;
res[i] += 10;
}
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
} bool cmp(string s1, string s2) { // under condition: s1,s2 >= 0
int n = s1.length(), m = s2.length();
int i;
for (i = 0; i < n-1 && s1[i] == '0'; i ++);
s1 = s1.substr(i);
for (i = 0; i < m-1 && s2[i] == '0'; i ++);
s2 = s2.substr(i);
if (s1.length() != s2.length()) return s1.length() < s2.length();
return s1 < s2;
} string Add(string s1, string s2) {
if (s1[0] == '-' && s2[0] == '-') {
return "-" + add(s1.substr(1), s2.substr(1));
}
else if (s1[0] == '-') {
s1 = s1.substr(1);
if (cmp(s1, s2) == true) {
return sub(s2, s1);
} else {
return "-" + sub(s1, s2);
}
}
else if (s2[0] == '-') {
s2 = s2.substr(1);
if (cmp(s1, s2) == true) {
return "-" + sub(s2, s1);
} else {
return sub(s1, s2);
}
}
else {
return add(s1, s2);
}
} string Sub(string s1, string s2) {
if (s2[0] == '-') {
s2 = s2.substr(1);
return Add(s1, s2);
}
else {
return Add(s1, "-" + s2);
}
} string multi(string s1, string s2) { // under condition: s1,s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = n + m;
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
res[i+j] += a[i] * b[j];
for (int i = 0; i < len; i ++) {
res[i+1] += res[i] / 10;
res[i] %= 10;
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
} pair<string, string> divide(string s1, string s2) { // under condition: s1>=0,s2>0
string s = "", t = "";
int n = s1.length(), m = s2.length();
bool flag = false;
for (int i = 0; i < n; i ++) {
s += s1[i];
int num = 0;
while (cmp(s, s2) == false) {
num ++;
s = sub(s, s2);
}
if (num > 0) {
flag = true;
char c = (char)(num + '0');
t += c;
}
else if (flag) {
t += '0';
}
}
if (t.length() == 0) t = "0";
while (s[0] == '0' && s.length() > 1) s = s.substr(1);
return make_pair(t, s);
} string s1, s2; int main() {
while (cin >> s1 >> s2) {
cout << "add:\t" << Add(s1, s2) << endl;
cout << "sub:\t" << Sub(s1, s2) << endl;
cout << "multi:\t" << multi(s1, s2) << endl;
pair<string, string> divide_pair = divide(s1, s2);
cout << "divide:\t" << divide_pair.first << " ...... " << divide_pair.second << endl;
}
return 0;
}

测试数据:

100 9
add: 109
sub: 91
multi: 900
divide: 11 ...... 1
1000000 87
add: 1000087
sub: 999913
multi: 87000000
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. loadrunner11录制为空的解决办法(win7+chrome最新版本)

    参考:https://www.cnblogs.com/zhang-zhi/archive/2018/09/10/9622605.html loadrunner11在win7中,使用chrome浏览器的 ...

  2. placeholder改变输入框字体颜色

    ::-webkit-input-placeholder {  color: #888;}:-moz-placeholder {  color: #888;}::-moz-placeholder{col ...

  3. WPF style 换肤

    原文地址:http://www.cnblogs.com/DebugLZQ/p/3181040.html 原作者:DebugLZQ UI的风格一致性是应用程序应当关注的重要特性. 1.Creating ...

  4. C++通配符

    #include<iostream>using namespace std;bool PathernMatch(char *pat, char *str){ char *s = NULL; ...

  5. Leetcode2.Add Two Numbers两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  6. php array_key_exists() 与 isset() 的区别

    一个基本的区别是isset()可用于数组和变量,而array_key_exits()只能用于数组. 但是最主要的区别在于在设定的条件下的返回值. 现在我们来验证一下这个最主要的区别. array_ke ...

  7. Java大数类BigDecimal及八种舍入模式的介绍

    BigDecimal的引入 在利用Java编程语言开发银行.金融类等需要对数值进行高精度计算的软件时,我们经常使用BigDecimal和BigInteger这两个大数据类,而不是常见的int.long ...

  8. Directx11教程(57) 环境映射

    原文:Directx11教程(57) 环境映射       建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...

  9. 如何在iPhone 显示一个 星级评分

    http://blog.csdn.net/fanjunxi1990/article/details/8663914 由于项目需求,需要做一个列表,里面有各个商品的评分,就是app store里面所有a ...

  10. C++:for范围循环特点--自我理解

    for(declaration : expression)statement for(xx-type i : P)....其一:for范围类型循环在循环前,可能会对p所在的队列里,对每一个对象进行一次 ...