高精度算法也可以称为大整数算法,用于处理那些长度过大,long long 都无法解决的问题。
基本思路,利用数组等数据结构存储大整数,然后模拟大整数的运算,来实现高精度运算。

大整数加法

利用两个string存储整数,然后根据两者的长度关系,将短的前面补上0,以实现长度的等长关系,方便后续运算。
定义一个int变量用于记录进位关系
从sting的尾部(个位)开始逐位相加对10取余加到结果string的前面string支持直接相加实现相连效果 注意也要把前一位的进位信息加上去。并记录本位的进位信息。
注意由于加法可能最高位会进一位,所以要注意最后看看首位是否需要加一个1

#include <bits/stdc++.h>
using namespace std;
int main()
{
    //a+b=c
    string a, b, c;
    cin >> a >> b;
    int as=a.size(),bs=bs.size();
    //短的补0
    if (a.size() > b.size())
    {
        for (int i = 0; i < as-bs; i++)
        {
            b = "0" + b;
        }
    }
    else
    {
        for (int i = 0; i < bs-as; i++)
        {
            a = "0" + a;
        }
    }
    int flag = 0;//进位信息变量
    for (int i = a.size() - 1; i >= 0; i--)
    {
        //添加到首位
        c = char((a[i] + b[i] - 2 * '0' + flag) % 10 + '0') + c;
        //记录进位信息
        flag = (a[i] + b[i] - 2 * '0' + flag) / 10;
    }
    //是否需要首位补1
    if (flag)
    {
        c = '1' + c;
    }
    //输出
    cout << c;
}

大整数减法

利用两个string存储整数,然后根据两者的长度关系,将短的前面补上0,以实现长度的等长关系,方便后续运算。
定义一个int变量用于记录借位
利用字符串比较来保证a总是大的那个数,否则交换一下,并记录一下以便输出的时候输出负号
模拟减法

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a, b, c;
    int f = 0;
    cin >> a >> b;
    int as = a.size();
    int bs = b.size();
    if (a.size() > b.size())
    {
        for (int i = 0; i < as - bs; i++)
        {
            b = "0" + b;
        }
    }
    else
    {
        for (int i = 0; i < bs - as; i++)
        {
            a = "0" + a;
        }
    }
    if (b > a)
    {
        f = 1;
        string s;
        s = b;
        b = a;
        a = s;
    }
    int flag = 0;
    for (int i = a.size() - 1; i >= 0; i--)
    {
        if (a[i] - flag < b[i])
        {
            c = char(a[i] - flag - b[i] + 10 + '0') + c;
            flag = 1;
        }
        else
        {
            c = char(a[i] - flag - b[i] + '0') + c;
            flag = 0;
        }
    }
    if (f)
    {
        cout << "-";
    }
    cout << c;
}

大整数乘法

大整数除法