高精度

高精度加法

二维数组web

int n, len, f[5050][5050];

void High_precision_add(int k)
{
    for(int i = 1;i <= len ;i++)
        f[k][i] = f[k - 1][i] + f[k - 2][i];
    for(int i = 1;i <= len; i++)
    {
        if(f[k][i] >= 10)
        {
            f[k][i + 1] += f[k][i] / 10;
            f[k][i] %= 10;
            if(f[k][len + 1] > 0)
                len++;
        }
    }
}

void solve()
{
    cin >> n;
    len = 1;
    f[1][1] = 1;
    f[2][1] = 2;
    for(int i = 3;i <= n; i++)
    {
        High_precision_add(i);
    }
    for(int i = len;i >= 1; i--)
        cout << f[n][i];
}

字符串数组

string High_precision_add(string a, string b)
{
    string ans = "";
    int p[5005], q[5005];
    mem(p, 0);
    mem(q, 0);
    int len_a = a.length(), len_b = b.length();
    for(int i = 0;i < len_a; i++)
        p[len_a - 1 - i] = a[i] - '0';
    for(int i = 0;i < len_b; i++)
        q[len_b - 1 - i] = b[i] - '0';
    int len_max = len_a > len_b ? len_a : len_b;
    for(int i = 0;i < len_max; i++)
    {
        p[i] += q[i];
        p[i + 1] += p[i] / 10;
        p[i] %= 10;
    }
    if(p[len_max])
        len_max++;
    for(int i = len_max - 1;i >= 0; i--)
        ans += (p[i] + '0');
    return ans;
}

高精度减法

字符串,大的非负整数减少的非负整数svg

string High_precision_sub(string a, string b)
{
    string ans = "";
    int p[5005], q[5005];
    mem(p, 0);
    mem(q, 0);
    int len_a = a.length(), len_b = b.length();
    for(int i = 0;i < len_a; i++)
        p[len_a - 1 - i] = a[i] - '0';
    for(int i = 0;i < len_b; i++)
        q[len_b - 1 - i] = b[i] - '0';
    int len_max = len_a > len_b ? len_a : len_b;
    for(int i = 0;i < len_max; i++)
    {
        p[i] -= q[i];
        if(p[i] < 0)
        {
            p[i] += 10;
            p[i + 1]--;
        }
    }
    while(!p[len_max - 1] && len_max)
        len_max--;
    for(int i = len_max - 1;i >= 0; i--)
        ans += (p[i] + '0');
    if(ans == "")
        return "0";
    return ans;
}

高精度乘法

字符串spa

string High_precision_mul(string a, string b)
{
    string ans;
    int p[5005], q[5005], s[5005];
    mem(p, 0);
    mem(q, 0);
    mem(s, 0);
    int len_a = a.length(), len_b = b.length();
    for(int i = len_a - 1;i >= 0; i--)
        p[len_a - i] = a[i] - '0';
    for(int i = len_b - 1;i >= 0; i--)
        q[len_b - i] = b[i] - '0';
    for(int i = 1;i <= len_a; i++)
        for(int j = 1;j <= len_b; j++)
            s[i + j - 1] += p[i] * q[j];
    for(int i = 1;i <= len_a + len_b; i++)
    {
        s[i + 1] += s[i] / 10;
        s[i] %= 10;
    }
    if(s[len_a + len_b])
        ans += s[len_a + len_b] + '0';
    for(int i = len_a + len_b - 1;i >= 1; i--)
    {
        ans += s[i] + '0';
    }
    return ans;
}

高精度除法

字符串code

int sub(int *p, int *q, int len_a, int len_b)
{
    if(len_a < len_b)
        return -1;
    if(len_a == len_b)
    {
        for(int i = len_a - 1;i >= 0; i--)
        {
            if(p[i] > q[i])
                break;
            else if(p[i] < q[i])
                return -1;
        }
    }
    for(int i = 0;i < len_a; i++)
    {
        p[i] -= q[i];
        if(p[i] < 0)
        {
            p[i] += 10;
            p[i + 1]--;
        }
    }
    for(int i = len_a - 1;i >= 0; i--)
    {
        if(p[i])
            return i + 1;
    }
    return 0;
}

string High_precision_div(string a, string b, int flag)
{
    string ans, cnt;
    int p[5005], q[5005], s[5005];
    mem(p, 0);
    mem(q, 0);
    mem(s, 0);
    int len_a = a.length(), len_b = b.length();
    int len = len_a;
    for(int i = len_a - 1;i >= 0; i--)
        p[len_a - i - 1] = a[i] - '0';
    for(int i = len_b - 1;i >= 0; i--)
        q[len_b - i - 1] = b[i] - '0';
    if(len_a < len_b || (len_a == len_b && a < b))
        return a; // cout << "0" << endl;
    int t = len_a - len_b;
    for(int i = len_a - 1;i >= 0; i--)
    {
        if(i >= t)
            q[i] = q[i - t];
        else
            q[i] = 0;
    }
    len_b = len_a;
    for(int j = 0;j <= t; j++)
    {
        int temp;
        while((temp = sub(p, q + j, len_a, len_b - j)) >= 0)
        {
            len_a = temp;
            s[t - j]++;
        }
    }
    for(int i = 0;i < len_a; i++)
    {
        s[i + 1] += s[i] / 10;
        s[i] %= 10;
    }
    int k = len;
    while(!s[k])
        k--;
    while(k >= 0)
        ans += s[k--] + '0'; // 商
    k = len;
    while(!p[k])
        k--;
    while(k >= 0)
        cnt += p[k--] + '0'; // 余数
    if(cnt.empty())
        cnt = "0";
    if(flag == 1)
        return ans;
    return cnt;
}