由于数据的范围限制,较大的数没法用一般的+-*/来运算,这时候就要用高精度乘除加减法,每次这个我都写的很乱,花好久来调试,所以把模板列在了下面,具体实现过程可以画图来理解,代码旁边有注释。
一,高精度加法
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> A, B, C;//便于随时改变大小
void Add(vector<int> A, vector<int>B){
if (A.size() < B.size()) {
Add(B, A);
return;
}//因为要遍历长的那一个
//123+12->321
// +21
int t = 0;//用来处理进制
for (int i = 0; i < A.size(); i++) {
t += A[i];
if (i < B.size()) t += B[i];//B没有处理完时,要加上去
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);//处理最高位进制,例如123+900的类型
}
int main() {
string a, b;
cin >> 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');
Add(A,B);
for (int i = C.size() - 1; i >= 0; i--) {
cout << C[i];
}
return 0;
}
二,高精度减法
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> A, B, C;//便于随时改变大小
bool cmp(vector<int>A,vector<int>B) {
if (A.size() != B.size()) return A.size() > B.size();//比较长度,例如,12>2
for (int i = A.size() - 1; i >= 0; i--) {//因为A,B已经倒过来,所以要倒叙遍历
if (A[i] != B[i]) return A[i] > B[i];
}
return true;//两数字相等的情况
}
void sub(vector<int>A, vector<int>B) {
int t = 0;//除数的大小
for (int i = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);//防止负数的影响,正数加10后%10,相等于没有加,负数则会转化为正数压进去
if (t < 0) {//处理进制
t = 1;
}
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前缀0
}
int main() {
string a, b;
cin >> 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)) sub(A, B);
else {
cout << "-";
sub(B, A);
}
for (int i = C.size() - 1; i >= 0; i--) {
cout << C[i];
}
return 0;
}
三,高精度乘法
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> A, C;//采用vector容器,在不知道大小的情况下,可以无限扩展
void cheng(vector<int>A, int b) {
int t = 0;
for (int i = 0; i < A.size()||t; i++) {
if (i < A.size()) t += A[i] * b;//b乘以a的每一位
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
}
int main() {
string a;
int b;
cin >> a >> b;
//倒序,便于处理运算
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
cheng(A,b);
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
return 0;
}
四,高精度除法
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> A, C;
string a;
int b,r;//余数
void div() {
for (int i = A.size() - 1; i >= 0; i--) {//除法要从高位算起,所以要把A翻转为正序
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}//模拟除法运算过程
reverse(C.begin(), C.end());//此时为09999这样的类型,翻转过来去除前缀0
while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前缀0
}
int main() {
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i]-'0');
div();
for (int i = C.size() - 1; i >= 0; i--) {
cout << C[i];
}
cout <<endl<< r << endl;
return 0;
}