计算的数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. swiper如何禁止左右箭头切换

    swiper做项目时,需求 带着左右两边的箭头, 场景1:swiper自动切换,此时左右箭头点击时不能切换   场景2:swiper手动切换,左右箭头可以实现切换,通过翻阅api 终于找到 <s ...

  2. 详细解析Java虚拟机的栈帧结构

    欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ...

  3. 使用iview遇到问题记录总结

    1.iview设置日期不可用,设置开始开始时间早于结束时间 官网示例,设置今天之前不可选,但是不能识别thisdisabledDate (date) { return date && ...

  4. Go Goosy Disk Docker Port Provisioners(GDP)

    小伙伴们,她们中出了一个叛徒,他是谁?是谁?是谁? 由一则口口相传的故事开始吧: 中午吃饭时间抽空小李跑到同座大楼的小张公司串门,小李是一名docker顾问熟称砖家,这间公司老板想挖小李,他盯了前台不 ...

  5. 【LC_Lesson7】---将两个有序链表合成新的一个有序链表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...

  6. .net core 2.2 中IHttpClientFactory的使用

    在.net core中使用HttpClient请求api,有很多资源的问题,比如使用using的时候,虽然可以释放资源,但是套接字(socket)也不会立即释放,所以.net core2.1中,新增了 ...

  7. EasyExcel 自定义单元格式的问题。

    最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...

  8. pymysql 增

    1.重点:数据库插入数据需要进行---------事物提交 其它:事物回滚 import pymysql # 注册用户 print("=========注册用户===========&quo ...

  9. .Net Core2.*学习手册

    1.net core 基础知识解析(创建一个.net core网站)(视频录制) 1.1 Startup解析(没写) 1.2 目录结构分析(没写) 1.3 使用静态文件(没写) 1.4 Control ...

  10. 这个时候 快下班了 我来翻译一段: Pro ASP.NET MVC 3 Framework

    Binding to a Derived Type绑定派生类型Although we have focused on interfaces (since that is most relevant i ...