大整数A用是string定义,小整数b用int定义
高精度加法模板
// 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;
}
高精度减法模板
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i ++ )
{
t = A[i] - t;
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();
return C;
}
Tips : 该模板需满足A >= B,建立一个函数cmp判断
bool cmp(vector<int> &A, vector<int> &B)
{
if (A.size() != B.size()) return A.size() > B.size(); //if(A>B)=>返回true,
//else if(A<B)=>返回false
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> mul(vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i ++ )
{
if (i < A.size()) t += A[i] * b; //该循环有两个判断条件'||',if(**)可排除满足t但不满足i<A.size()的情况
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
高精度除以低精度模板
// A / b, 商为C ,余数为r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i -- ) //切记i--勿写错为i++
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 3000;
int x[N],y[N];
int c[N];
string a,b;
int num;
void mults()
{
num = a.size()+b.size()-1; //最后的结果长度 = 数a的长度+数b的长度 - 1,前面不够补0
for(int i=0;i<num;i++)
{
for(int j=0;j<=i;j++) c[i] += x[j]*y[i-j];
if(c[i]>=10)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
//去掉多余的前导零
for(int i=num;i>0;i--)
{
if(c[i] == 0)num--;
else break;
}
}
int main()
{
cin>>a>>b;
memset(x,0,sizeof(x)); //对数组清零
memset(y,0,sizeof(y));
for(int i =a.size()-1;i>=0;i--) x[a.size()-1-i]=a[i] -'0';
for(int i= b.size()-1;i>=0;i--) y[b.size()-1-i]=b[i] -'0';
mults();
for(int i=num;i>=0;i--) printf("%d",c[i]);
return 0;
}