高精度

加法

// 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;
}

乘法

// 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;
}

除法

// 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 -- )
    {
        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;
}

参考:常用代码模板1——基础算法 - AcWing

A+B Problem(高精)

题目描述

高精度加法,相当于 a+b problem,不用考虑负数

输入格式

分两行输入。a,b \leq 10^{500}a,b≤10500。

输出格式

输出只有一行,代表 a+ba+b 的值。

输入输出样例

输入

1
1

**输出 **

2

**输入 **

1001
9099

输出

10100

source code

#include <iostream>
#include <vector>
#define out(x) for (int i = x.size() - 1; i >= 0; i--)
using namespace std;
// 加引用避免再拷贝整个数组
vector<int> add(vector<int> &A, vector<int> &B)
{
    // 定义储存结果的vector以及进位t,第0位没有进位->初始化为0
    vector<int> result;
    int t = 0;
    // 从个位开始遍历直至遍历完A和B的所有位
    for (int i = 0; i < A.size() || i < B.size(); i++)
    {
        // 每一次用t表示Ai,Bi与上一个数的进位这三个数的和
        if (i < A.size())
            t += A[i];
        if (i < B.size())
            t += B[i];
        // 当前这一位输出t除以10的余数
        result.push_back(t % 10);
        // t是否进位
        t /= 10;
    }
    // 如果最高位有进位则补1
    if (t)
        result.push_back(t);
    return result;
}
int main()
{
    // 使用字符串读入
    string a, b;
    vector<int> A, B;
    cin >> a >> b; // a = "123456"
    // 使用vector逆序读入,变成整数需要减去偏移量0
    out(a) A.push_back(a[i] - '0'); // A = [6,5,4,3,2,1]
    out(b) B.push_back(b[i] - '0');
    // 相当于vector<int>
    auto C = add(A, B);
    // 倒序输出
    out(C) cout << C[i];
    return 0;
}

python版

a=int(input())
b=int(input())
print(a+b)

NOIP2015 普及组 扫雷游戏

题目描述

扫雷游戏是一款十分经典的单机小游戏。在 \(n\)\(m\) 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出 \(n\)\(m\) 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式

第一行是用一个空格隔开的两个整数 \(n\)\(m\),分别表示雷区的行数和列数。

接下来 \(n\) 行,每行 \(m\) 个字符,描述了雷区中的地雷分布情况。字符 \(\texttt{*}\) 表示相应格子是地雷格,字符 \(\texttt{?}\) 表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式

输出文件包含 \(n\) 行,每行 \(m\) 个字符,描述整个雷区。用 \(\texttt{*}\) 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

样例输入

3 3
*??
???
?*?

样例输出

*10
221
1*1

样例输入

2 3
?*?
*??

样例输出

2*1
*21

提示

对于 \(100\%\)的数据,\(1≤n≤100, 1≤m≤100\)

source code

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#include <cstring>
#define out(v, x) for (int v = 1; v <= x; v++)
using namespace std;
const int N = 1e4;
bool mine[N][N];
int main()
{
    memset(mine, 0, sizeof(mine));
    int n, m;
    cin >> n >> m;
    char c;
    out(i, n) out(j, m){
        cin >> c;
        mine[i][j] = (c == '*');
    }
        out(i, n){
            out(j, m){
                if (mine[i][j]==1)
                    printf("*");
                else
                    printf("%d", mine[i + 1][j - 1] + mine[i + 1][j] + mine[i + 1][j + 1] + mine[i][j - 1] + mine[i][j + 1] + mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1]);
            }
            printf("\n");
        }
        return 0;
}

posted @ 2022-08-01 20:57  HeadmasterEggy  阅读(104)  评论(0)    收藏  举报