计算的数long long 甚至更大的数据类型的都存不下的时候,应该怎么办 ?

解决方法 :我们可以把一个很大的数当做字符串进行处理,这时候就需要用到高精度。

话不多说,咱们边看代码边处理 :

加法 :

PK一下

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int main(void) {
vector<int> add(vector<int> &A,vector<int> &B);
// Vector容器相当于是一个数组,比数组处理起来更加方便 (返回一个 vector 类型的值)
vector<int>A,B,C;
string a,b;
cin >> a >> b; // 输入两个大数
for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
// 我们进行加法的时候要从低位开始,字符串输入的时候低位在最后,所以我们要将字符串逆序存储在容器中
for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0');
C = add(A,B);
for(int i = C.size() - 1; ~i; i --) cout << C[i];
// 同理,输出的时候也要逆序输出
return 0;
} vector<int> add(vector<int> &A,vector<int> &B) {
if(A.size() < B.size()) return add(B,A); // 尽量用长的 + 短的,因为这样多余的部分我们就可以直接进行处理了
vector<int> C; // 设置一个 vector 类型的变量,用来作为返回的值
int t = 0;
for(int i = 0; i < A.size(); i ++) {
t += A[i];
if(B.size() > i) t += B[i]; // B 有一定的限制,不能一直加 呀
C.push_back(t % 10);
t /= 10; // 进位
}
if(t) C.push_back(t); // 可能会多出来一个,例如3位数 + 3 位数 ,结果有可能是 4 位数
return C; }

减法 :

  注意 : 1、答案有可能是负数
2、最后存储在 vector 中的字符串可能会存在前导 0

PK一下

Code :

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int main(void) {
void ClearZero(vector<int> &A); // Clear 前导 0
bool cmp(vector<int> &A,vector<int> &B); // 比较两个字符串,让 大的减去 小的
vector<int> sub(vector<int> &A,vector<int> &B); vector<int>A,B,C;
string a,b;
cin >> a >> b;
for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0');
ClearZero(A),ClearZero(B); // 先去除字符串计算本身的的前导 0
if(cmp(A,B)) {
C = sub(A,B);
} else {
C = sub(B,A); // 交换
cout << "-"; // 输出 - 代表负数
}
for(int i = C.size() - 1; ~i; i --) cout << C[i];
cout << endl << r << endl;
return 0;
} void ClearZero(vector<int> &A) {
while(A.size() > 1 && A.back() == 0) A.pop_back();
return ;
} bool cmp(vector<int> &A,vector<int> &B) {
if(A.size() != B.size()) return A.size() >= B.size();
for(int i = A.size(); ~i; i --) { // 倒序
if(A[i] != B[i]) { // 长度相同时则进行字典序比较
return A[i] > B[i];
}
}
return true;
} vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int>C;
int t = 0;
for(int i = 0; i < A.size(); i ++) {
t = A[i] - t;
if(B.size() > i) t -= B[i];
C.push_back((t + 10) % 10);
if(t < 0) t = 1; // 如果得到的是负数,说明需要借位,这时候下次计算时就需要 - 1
else t = 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back(); // Clear 前导 0
return C;
}

乘法(高精度 * 整数) :

PK一下

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int main(void) { vector<int> mul(vector<int> &A,int b); vector<int>A,B,C;
string a;
int value;
cin >> a >> value;
for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
C = mul(A,value);
for(int i = C.size() - 1; ~i; i --) cout << C[i];
return 0;
} vector<int> mul(vector<int> &A,int b) {
int t = 0;
vector<int> C;
for(int i = 0; i < A.size(); i ++) { // 模拟乘法过程
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
while(t) { // 处理最后的那个数
C.push_back(t % 10);
t /= 10;
}
return C;
}

除法:

PK一下

#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int main(void) {
vector<int> div(vector<int> &A,int b,int &r); vector<int>A,B,C;
string a;
int value;
cin >> a >> value;
for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0');
int r; // 余数
C = div(A,value,r);
for(int i = C.size() - 1; ~i; i --) cout << C[i];
cout << endl << r << endl;
return 0;
} vector<int> div(vector<int> &A,int b,int &r) { // 引用变量,相当于是全局变量,直接在函数内部进行修改
vector<int> C;
r = 0; // 初始化
for(int i = A.size() - 1; ~i; i --) { // 除法是从高位向低位进行的
r = r * 10 + A[i]; // 得到除数,每次向后移动一位(余数要乘 10 -- 可以模拟一下,很好理解)
C.push_back(r / b); // 刚开始可能为 0
r %= b;
}
reverse(C.begin(),C.end()); // 反转是为了处理前导 0
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}

高精度模板(Vector实现更加方便)的更多相关文章

  1. [Template]高精度模板

    重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...

  2. C++高精度模板

    原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...

  3. [note]高精度模板

    高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...

  4. 高精度模板 支持各种运算 c++

    绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...

  5. 高精度模板 Luogu P1932 A+B & A-B & A*B & A/B Problem

    P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...

  6. 高精度模板 洛谷Luogu P1932 A+B & A-B & A*B & A/B Problem

    P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...

  7. Java 大数、高精度模板

    介绍: java中用于操作大数的类主要有两个,一个是BigInteger,代表大整数类用于对大整数进行操作,另一个是BigDecimal,代表高精度类,用于对比较大或精度比较高的浮点型数据进行操作.因 ...

  8. JAVA高精度模板

    刚开始还坚持用C++写高精来着,后来发现JAVA写高精方便太多了,所以也来学习一下JAVA高精度的模板. 参考:https://www.cnblogs.com/imzscilovecode/p/883 ...

  9. C++标准库类模板vector

    vector是C++标准库STL中的一个重要的类模板,相当于一个更加健壮的,有很多附加能力的数组 使用vector前首先要包含头文件 #include<vector>  1.vector的 ...

随机推荐

  1. Flink系列之Time和WaterMark

    当数据进入Flink的时候,数据需要带入相应的时间,根据相应的时间进行处理. 让咱们想象一个场景,有一个队列,分别带着指定的时间,那么处理的时候,需要根据相应的时间进行处理,比如:统计最近五分钟的访问 ...

  2. Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)

    Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  3. Netty快速入门(09)channel组件介绍

    书接上回,继续介绍组件. ChannelHandler组件介绍 ChannelHandler组件包含了业务处理核心逻辑,是由用户自定义的内容,开发人员百分之九十的代码都是ChannelHandler. ...

  4. ArcGIS Server for JavaScript 3.3 的安装部署

    一.安装包下载 首先从官网下载ArcGIS API for JavaScript 3.3 的API和SDK,地址:http://support.esrichina.com.cn/2011/0223/9 ...

  5. Docker——WIN7 安装 Docker实战与入门

    1.Docker简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Lin ...

  6. mysql 多主一从

    一.主服务器准备 1.1.环境准备 两台主机器ip分别为 100.100.100.105 (主1) 100.100.100.106(主2) 安装 mysql [root@centos ~]# yum ...

  7. Flask DBUtils

    作用:创建连接池,解决多线程问题 1.安装模块 pip3 install -i https://pypi.douban.com/simple DBUtils 2.settings.py(配置文件) f ...

  8. [洛谷P4097] [HEOI2013] Segment

    Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 2.给定一个数 \(k\) ,询问与直线 \(x = k\ ...

  9. 洛谷P2585 [ZJOI2006]三色二叉树

    题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数,依 ...

  10. xsd 和 wsdl

    xsd : 可用方便 不同的语言之间的 用命令行来 转换对应语言的. wsdl: 可用方便不同语言的类描述 用命令行 来相互转换. 类似 thift me ?