高精度加法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e5;
ll a[MAX],b[MAX];    //数组的大小决定了最高位数
string s1,s2;
int main()
{
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    cin >> s1 >> s2;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());       //    反转字符串
    a[0] = s1.length();              //   取得s1的长度
    for(int i = 1;i <= a[0] ;i++){
        a[i] = s1[i-1]-'0';              //把字符转化为数字并将其存入数组a中
    }
    b[0] = s2.length();               //    取得s2的长度
    for(int i = 1;i <= b[0];i++){
        b[i] =s2[i-1]-'0';
    }
    ll len = max(a[0],b[0]);          //取s1,s2长度的的较大值
    for(int i = 1;i <= len ;i++){
        a[i] += b[i];                //求和
        a[i+1] += a[i] / 10;          //进位
        a[i] = a[i] % 10;            //求得本位
    }
    len ++;
    while(a[len] == 0 && len > 1)  len--;   //去掉前面的0(最高位没有进位的话,最高位为0)
    for(ll i = len ; i > 0 ;i -- ){
        cout<<a[i];
    }
    return 0;
}

高精度乘法

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5;
typedef long long ll;
string s1,s2;
ll a[MAX],b[MAX],c[MAX];
ll len;
int main()
{
    cin>>s1>>s2;
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    a[0]=s1.length();
    for(int i=1;i<=a[0];i++) a[i]=s1[i-1]-'0';
    b[0]=s2.length();
    for(int i=1;i<=b[0];i++) b[i]=s2[i-1]-'0';
    for(int i=1;i<=a[0];i++){
        for(int j=1;j<=b[0];j++){
            c[i+j-1] += a[i]*b[j];
            c[i+j] += c[i+j-1]/10;
            c[i+j-1] %=10;
        }
    }
    len=a[0]+b[0]+1;
    while(c[len]==0&&len>1) len--;
    for(ll i=len;i>0;i--){
        cout<<c[i];
    }
    return 0;
}

下面的文章讲的非常详细,大家可以去理解一下
https://blog.csdn.net/zsjzliziyang/article/details/82050337