计算的数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. C#事件(Event): 发布符合 .NET Framework Guidelines 的事件

    本文翻译整理自:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-publish-event ...

  2. 《C++Primer》第五版习题答案--第三章【学习笔记】

    [C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...

  3. restapi-sql

    身份验证,确定该成员是交过费的机构的成员,包含(用户名)和(密码) 各个表中的属性,有关timetemp等特殊类型,LocalDate等日期等具体格式. 引入了传输过程的不同的数据格式导致的两个错误, ...

  4. .Net Framework为什么需要联网?

    .Net Framework在安装时需要从微软官方网站下载语言包,所以需要联网. 如果想要真正离线安装,需要先把所需的语言包下载下来.

  5. 洛谷 UVA11021 Tribles

    UVA11021 Tribles 题意翻译 题目大意 一开始有kk种生物,这种生物只能活1天,死的时候有p_ipi​的概率产生ii只这种生物(也只能活一天),询问m天内所有生物都死的概率(包括m天前死 ...

  6. rdlc报表输入中文出现小方块

    在用vs自带的报表文件的时候,在输入中文的时候,会出现一些小方块. 百度到的资料:当然我试了下,没有用. 用文本编辑器(我用的是editplus)打开需要批量处理的rdlc文件. 将所有 <St ...

  7. 不要把 JWT 用作 session

    现在很多人使用 JWT 用作 session 管理,这是个糟糕的做法,下面阐述原因,有不同意见的同学欢迎讨论. 首先说明一下,JWT 有两种: 无状态的 JWT,token 中包含 session 数 ...

  8. NHibernate 初识(0)

    参考资料: http://nhibernate.info/

  9. 深入Node模块Buffer-学会操作二进制

    Buffer 作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力.本文记录了几个问题,来加深对 Buffer 的理解和使用: 认识缓冲器 如何申请堆外内存 如何计算字节长度 如何计 ...

  10. 数据结构 二维数组-->稀疏数组-->二维数组

    稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不 ...