高精度
一、高精度加法(大数相加)
题目示意:
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1
≤
整
数
长
度
≤
100000
1≤整数长度≤100000
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35
思路:
- 用字符串输入的大整数
- 将字符转化为int型 → 将字符串每一位转化成int型
- 加法本质,从低位到高位,依次相加,a + b ≥ 10则进位
- 每位加完后,再从高位到低位依次输出
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B){
if(A.size() < B.size()) return add(B, A); // 设定A.size() > B.sieze(),简便
vector<int> C; // 存储结果
int t = 0; // 进位(只会是0或1)
for(int i = 0; i < A.size(); i ++){
t += A[i]; // 当前进位的值加上A[i]
if(i < B.size()) t += B[i]; // B[i]还存在,说明这一位还是需要相加
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t); // 最后判断是否还有进位,有就向前+1
return C;
}
int main(){
string a, b;
cin >> a >> b;
vector<int> A, B;
// 应把最低位放在前面
for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0'); // 每一位数字字符-'0'就可以得到int类型数字
for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0'); // 同上
auto C = add(A, B);
for(int i = C.size() - 1; i >= 0; i --) cout << C[i]; //倒序输出
return 0;
}
二、高精度减法(大数相减)
题目示意:
给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1
≤
整
数
长
度
≤
105
1≤整数长度≤105
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
思路:
- 用字符串输入的大整数
- 将字符转化为int型 → 将字符串每一位转化成int型
- 加法本质,从低位到高位,依次相加,a - b ≤ 0则借位位
- 每位减完后,再从高位到低位依次输出
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
// 判断A是否大于B
bool cmp(vector<int> &A, vector<int> &B){
if(A.size() != B.size()) return A.size() > B.size();
for(int i = A.size(); i >= 0; 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; // 借位,t = 0,未借位, t = 1,有借位
for(int i = 0; i < A.size(); i ++){
t = A[i] - t; // 用t计算当前位的结果
if(i < B.size()) t -= B[i];
C.push_back((t + 10) % 10); // t可能是负数
if(t < 0) t = 1; t < 0说明有借位
else t = 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back(); // 去掉前导0
return C;
}
int main(){
// 输入和转化同大数相加
string a, b;
cin >> a >> b;
vector<int> A, B;
for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0');
if(cmp(A, B)){ // A >= B 则输出正数,否则输出负数
auto C = sub(A, B);
for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
cout << endl;
}else{
auto C = sub(B, A);
cout << '-';
for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
cout << endl;
}
return 0;
}