高精度基本认识

登录以参加训练计划

A+B

#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 1 + 5];
int main()
{
    // 以字符串形式输入
    cin >> A >> B;

    // 转换为数字并翻转存入数组
    aLen = A.size();
    bLen = B.size();
    cLen = max(aLen, bLen); // 相加的结果,在进位之前的长度
    for (int i = 0; i < aLen; i++)
        a[aLen - i - 1] = A[i] - '0';
    for (int i = 0; i < bLen; i++)
        b[bLen - i - 1] = B[i] - '0';

    // (可选)数组清零
    for (int i = aLen; i < cLen; i++)
        a[i] = 0;
    for (int i = bLen; i < cLen; i++)
        b[i] = 0;
    for (int i = 0; i < cLen; i++)
        c[i] = 0;

    //  相加
    for (int i = 0; i < cLen; i++)
        c[i] = a[i] + b[i];

    // 进位
    for (int i = 0; i < cLen - 1; i++)
    {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }

    // 最高位扩展
    while (c[cLen - 1] >= 10)
    {
        c[cLen] = c[cLen - 1] / 10;
        c[cLen - 1] %= 10;
        cLen++;
    }

    // 前导 0 去除
    while (cLen > 1 && c[cLen - 1] == 0)
        cLen--;

    // 输出
    for (int i = cLen - 1; i >= 0; i--)
        cout << c[i];
    return 0;
}

A-B

#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int cFlag;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 5];
int main()
{
    // 以字符串形式输入
    cin >> A >> B;

    // 调整减法顺序,只做大数减小数
    // 此题 A,B 都没有多余的前导 0,可以直接用字符串大数比较的方法比较大小
    cFlag = 1;
    if (A.size() < B.size() ||
        (A.size() == B.size() && A < B))
    {
        swap(A, B);
        cFlag = -1;
    }

    // 转换为数字并翻转存入数组
    aLen = A.size();
    bLen = B.size();
    cLen = max(aLen, bLen); // 相加的结果,在进位之前的长度
    for (int i = 0; i < aLen; i++)
        a[aLen - i - 1] = A[i] - '0';
    for (int i = 0; i < bLen; i++)
        b[bLen - i - 1] = B[i] - '0';

    // (可选)数组清零
    for (int i = aLen; i < cLen; i++)
        a[i] = 0;
    for (int i = bLen; i < cLen; i++)
        b[i] = 0;
    for (int i = 0; i < cLen; i++)
        c[i] = 0;

    //  相减
    for (int i = 0; i < cLen; i++)
        c[i] = a[i] - b[i];

    // 借位
    for (int i = 0; i < cLen - 1; i++)
        if (c[i] < 0)
        {
            c[i + 1]--;
            c[i] += 10;
        }

    // 前导 0 去除
    while (cLen > 1 && c[cLen - 1] == 0)
        cLen--;

    // 输出
    if (cFlag == -1)
        cout << "-";
    for (int i = cLen - 1; i >= 0; i--)
        cout << c[i];
    return 0;
}

A*B

#include <bits/stdc++.h>
using namespace std;
const int LEN = 200;
string A, B;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + LEN + 5];
int main()
{
    // 以字符串形式输入
    cin >> A >> B;

    // 转换为数字并翻转存入数组
    aLen = A.size();
    bLen = B.size();
    cLen = aLen + bLen - 1; // 相乘的结果,在进位之前的长度
    for (int i = 0; i < aLen; i++)
        a[aLen - i - 1] = A[i] - '0';
    for (int i = 0; i < bLen; i++)
        b[bLen - i - 1] = B[i] - '0';

    //  相乘
    for (int i = 0; i < aLen; i++)
        for (int j = 0; j < bLen; j++)
            c[i + j] += a[i] * b[j];

    // 进位
    for (int i = 0; i < cLen - 1; i++)
    {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }

    // 最高位扩展
    while (c[cLen - 1] >= 10)
    {
        c[cLen] = c[cLen - 1] / 10;
        c[cLen - 1] %= 10;
        cLen++;
    }

    // 前导 0 去除
    while (cLen > 1 && c[cLen - 1] == 0)
        cLen--;

    // 输出
    for (int i = cLen - 1; i >= 0; i--)
        cout << c[i];
    return 0;
}

A/B

#include <bits/stdc++.h>
using namespace std;
const int LEN = 300;
string A, B;
int cFlag;
int aLen, bLen, cLen;
int a[LEN + 5], b[LEN + 5], c[LEN + 5];
// 比大小,比较 a 的 up~down 这些位置是否大于等于 b
// 保证没有多余的前导 0
bool cmp(int up, int down)
{
    if (up - down + 1 < bLen)
        return false;
    if (up - down + 1 > bLen)
        return true;
    for (int i = up; i >= down; i--)
    {
        if (a[i] < b[i - down])
            return false;
        if (a[i] > b[i - down])
            return true;
    }
    return true;
}
// 比大小,将 a 的 up~down 这些位置减去 b
// 保证没有多余的前导 0
void sub(int up, int down)
{
    for (int i = 0; i < bLen; i++)
        a[down + i] -= b[i];
    for (int i = down; i <= up; i++)
        if (a[i] < 0)
        {
            a[i + 1]--;
            a[i] += 10;
        }
}
int main()
{
    // 以字符串形式输入
    cin >> A >> B;

    // 转换为数字并翻转存入数组
    aLen = A.size();
    bLen = B.size();
    cLen = aLen; // 商去除前导 0 之前的长度
    for (int i = 0; i < aLen; i++)
        a[aLen - i - 1] = A[i] - '0';
    for (int i = 0; i < bLen; i++)
        b[bLen - i - 1] = B[i] - '0';

    // A / B = C,余数留在 A 里面
    int up = aLen - 1;
    for (int down = aLen - 1; down >= 0; down--)
    {
        while (up > down && a[up] == 0)
            up--;
        while (cmp(up, down))
        {
            c[down]++;
            sub(up, down);
            while (up > down && a[up] == 0)
                up--;
        }
    }

    // 去除前导 0
    while (cLen > 1 && c[cLen - 1] == 0)
        cLen--;
    while (aLen > 1 && a[aLen - 1] == 0)
        aLen--;

    // 输出
    for (int i = cLen - 1; i >= 0; i--)
        cout << c[i];
    cout << "\n";
    for (int i = aLen - 1; i >= 0; i--)
        cout << a[i];
    cout << "\n";

    return 0;
}

章节 1. 高精度计算【初步】

开放

题目 尝试 AC 难度
P1011   高精度除法 1 0 7
P1012   高精度减法 1 0 7
P1013   A+B Problem(高精) 1 1 7
P1014   高精求小数幂 0 0 7
P1015   A*B Problem 1 0 7
P1016   A/B Problem 2 0 7
P1017   最大乘积 0 0 7
P1018   求和 0 0 7

章节 2. 高精度计算【进阶】

开放

题目 尝试 AC 难度
P1019   华容道 0 0 10
P1020   解方程 0 0 9
P1021   斗地主 0 0 8
 
参加人数
2
创建人