计算的数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. 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. 使用WebUploader上传HTML文件并读取文件

    需求: 前端需要上传HTML文件并识别里面有多少个特殊标签并录入到数据库. 思路: 使用WebUploader上传文件,然后使用FileReader接口和DOMParser识别HTML中的特殊标签 资 ...

  3. Java项目之客户信息管理软件

    模拟实现基于文本界面的客户信息管理软件,该软件能够实现对客户对象的插入. 修改和删除(用数组实现),并能够打印客户明细表. 项目采用分级菜单方式.主菜单如下: “添加客户”的界面及操作过程如下所示: ...

  4. [AI开发]小型数据集解决实际工程问题——交通拥堵、交通事故实时告警

    这篇文章其实主要是想介绍在深度学习过程中如何使用小型数据集,这种数据集样本数量一般在1000以下,有时候甚至只有几百.一般提到神经网络,大家都会说数据量越丰富,准确性越高,但是实际工作中,可能收集不了 ...

  5. Spring Boot2 系列教程 (十四) | 统一异常处理

    如题,今天介绍 SpringBoot 是如何统一处理全局异常的.SpringBoot 中的全局异常处理主要起作用的两个注解是 @ControllerAdvice 和 @ExceptionHandler ...

  6. Spring学习记录3——Spring AOP

    SpringAOP基础 AOP简介: AOP是Aspect Oriented Programing的简称,翻译为“面向切面编程”.它适用于具有横切逻辑的应用场合,如性能检测,访问控制,事务管理及日志记 ...

  7. 递推 dp

    工大要建新教学楼了,一座很高很高的楼,它有n层.学校为了减少排电梯的队伍,建造了好多好多电梯,共有m个.为了让电梯有序,学校给每个电梯设定了独特的可停楼层,如 x1 x2 y1 y2 表示,x1楼层到 ...

  8. cf - 920 c 求能否实现交换

    C. Swap Adjacent Elements time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. 元素定位工具Weditor的使用

    (1).安装:pip install --pre --upgrade weditor 安装成功 (2).启动python -m weditor

  10. Nginx代理服务——正向代理

    正向代理 在/opt/app/code的目录下创建一个joy.html文件 <html> <head> <meta charset="utf-8"&g ...