#include <iostream>
#include <vector>
using namespace std;
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
//a 和 b 输入时不带前导0
int main()
{
string a, b;
vector<int> 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(a[i] - '0');
auto C = add(A, B);
for(int i = C.size() -1; i >= 0; --i) printf("%d",C[i]);
return 0;
}
高精度减法 —— 模板题 AcWing 792. 高精度减法
#include<iostream>
#include<algorithm>
#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()-1;i>=0;i--)
if(A[i]!=B[i]) return A[i]>B[i];
return true;
}
// C = A + B, A >= 0, B >= 0
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];
if(i<B.size()) t-=B[i];
C.push_back
((t+10)%10);
if(t<0) t=-1;
else t=0;
}
while(C.size()>1 && C.back()==0) C.pop_back();//删除大数的前导0
return C;
}
//a 和 b 输入时不带前导0
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))
{
auto C=sub(A,B);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
}
else
{
printf("-");
auto C=sub(B,A);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
}
return 0;
}
高精度乘低精度 —— 模板题 AcWing 793. 高精度乘法
#include <iostream>
#include <vector>
using namespace std;
// C = A * b; // A 是一个高精度的整数 b 是一个低精度整数
vector<int> mul (vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; ++ i) // for循环中 || t 是精髓 这处理了最后的进位运算
{
if ( i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for(int i = a.size() -1; i >= 0; -- i) A.push_back(a[i] - '0');
auto C = mul(A, b);
for(int i = C.size() - 1; i >= 0; -- i) printf("%d",C[i]);
return 0;
}
高精度乘高精度的写法
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
const int M = 1e8;
int a[N], b[N], c[M];
int main(){
char a1[N], b1[N];
// lena 表示输入数字 a 的长度,lenb 表示输入数字 b 的长度,
//lenc 表示结果数字 c 的长度,jw 表示进位
int lena, lenb, lenc, jw = 0;
cin >> a1 >> b1;
lena = strlen(a1);
lenb = strlen(b1);
lenc = lena + lenb;
// 将输入的字符数组转换为整数数组,同时反转字符数组
for (int i = 0; i < lena; i++) a[i] = a1[lena - i - 1] - '0';
for (int i = 0; i < lenb; i++) b[i] = b1[lenb - i - 1] - '0';
// 乘法运算
for (int i = 0; i < lena; i++){
for (int j = 0; j < lenb; j++){
c[i + j] += a[i] * b[j] + jw; // 逐位相乘,累加到 c 中,同时加上进位 jw
jw = c[i + j] / 10; // 计算进位
c[i + j] %= 10; // 保留当前位的值
}
c[i + lenb] = jw; // 将最终进位加到结果的下一位
}
// 处理结果,去除前导零
for (int i = lenc - 1; i >= 0; i--){
if (0 == c[i] && lenc > 1) lenc--; // 去除前导零
else break;
}
// 输出结果
for (int i = lenc - 1; i >= 0; i--) cout << c[i];
return 0;
}