高精度
加法
// 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;
}
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;
}

浙公网安备 33010602011771号