高精度模板(Vector实现更加方便)
计算的数long long 甚至更大的数据类型的都存不下的时候,应该怎么办 ?
解决方法 :我们可以把一个很大的数当做字符串进行处理,这时候就需要用到高精度。
话不多说,咱们边看代码边处理 :
加法 :
#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
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;
}
乘法(高精度 * 整数) :
#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;
}
除法:
#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实现更加方便)的更多相关文章
- [Template]高精度模板
重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...
- C++高精度模板
原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...
- [note]高精度模板
高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...
- 高精度模板 支持各种运算 c++
绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...
- 高精度模板 Luogu P1932 A+B & A-B & A*B & A/B Problem
P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...
- 高精度模板 洛谷Luogu P1932 A+B & A-B & A*B & A/B Problem
P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...
- Java 大数、高精度模板
介绍: java中用于操作大数的类主要有两个,一个是BigInteger,代表大整数类用于对大整数进行操作,另一个是BigDecimal,代表高精度类,用于对比较大或精度比较高的浮点型数据进行操作.因 ...
- JAVA高精度模板
刚开始还坚持用C++写高精来着,后来发现JAVA写高精方便太多了,所以也来学习一下JAVA高精度的模板. 参考:https://www.cnblogs.com/imzscilovecode/p/883 ...
- C++标准库类模板vector
vector是C++标准库STL中的一个重要的类模板,相当于一个更加健壮的,有很多附加能力的数组 使用vector前首先要包含头文件 #include<vector> 1.vector的 ...
随机推荐
- swiper如何禁止左右箭头切换
swiper做项目时,需求 带着左右两边的箭头, 场景1:swiper自动切换,此时左右箭头点击时不能切换 场景2:swiper手动切换,左右箭头可以实现切换,通过翻阅api 终于找到 <s ...
- 详细解析Java虚拟机的栈帧结构
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货. 什么是栈帧? 正如大家所了解的,Java虚拟机的内存区域被划分为程序计数器.虚拟机栈.本地方法栈.堆和方法区.(什么?你还不知道,赶紧去看看 ...
- 使用iview遇到问题记录总结
1.iview设置日期不可用,设置开始开始时间早于结束时间 官网示例,设置今天之前不可选,但是不能识别thisdisabledDate (date) { return date && ...
- Go Goosy Disk Docker Port Provisioners(GDP)
小伙伴们,她们中出了一个叛徒,他是谁?是谁?是谁? 由一则口口相传的故事开始吧: 中午吃饭时间抽空小李跑到同座大楼的小张公司串门,小李是一名docker顾问熟称砖家,这间公司老板想挖小李,他盯了前台不 ...
- 【LC_Lesson7】---将两个有序链表合成新的一个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- .net core 2.2 中IHttpClientFactory的使用
在.net core中使用HttpClient请求api,有很多资源的问题,比如使用using的时候,虽然可以释放资源,但是套接字(socket)也不会立即释放,所以.net core2.1中,新增了 ...
- EasyExcel 自定义单元格式的问题。
最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...
- pymysql 增
1.重点:数据库插入数据需要进行---------事物提交 其它:事物回滚 import pymysql # 注册用户 print("=========注册用户===========&quo ...
- .Net Core2.*学习手册
1.net core 基础知识解析(创建一个.net core网站)(视频录制) 1.1 Startup解析(没写) 1.2 目录结构分析(没写) 1.3 使用静态文件(没写) 1.4 Control ...
- 这个时候 快下班了 我来翻译一段: Pro ASP.NET MVC 3 Framework
Binding to a Derived Type绑定派生类型Although we have focused on interfaces (since that is most relevant i ...