模拟
0 什么是模拟
模拟就是按照题意建模,题目让你干什么你就照着它干什么。
模拟的思路非常简单,基本不需要思考。但模拟题有码量大,难调试等缺点,在考场写错也非常浪费时间。
1 经典例题
solution
这是一道再简单不过的模拟题了。
直接找到一个地雷然后按照题意对它周围的空格内的数加一即可。
注意边界问题。
时空复杂度: $O(N^2)$
#include <iostream> #include <cstdio> using namespace std; int n, m; char mp[110][110]; int ans[110][110]; int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { scanf("%s", mp[i] + 1); for (int j = 1; j <= m; j++) { if (mp[i][j] == '*') { for (int k = 0; k < 8; k++) { ans[i + dx[k]][j + dy[k]]++; } } } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (mp[i][j] == '*') { cout << '*'; } else { cout << ans[i][j]; } } cout << endl; } cout << endl; return 0; }
习题:
因为作者时间紧张,所以部分习题不配有题解,如有需要,请在评论区告知,谢谢!
2 高精度运算
以下摘自百度百科
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。
一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。
对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。
高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
高精度就是处理普通数据类型存不下的数之间的运算。
相信大家都学过列竖式,高精度其实就是在模拟列竖式的过程。
首先要解存储的问题。
我们可以用字符串输入,然后用一个int型的数组来存储。
这里我们可反向存储,方便我们从低位开始运算也方便高位进位。
接下来我们就开始模拟小学列竖式,从低位加起,超过十就进位。
核心代码:
//a+b=c //代码有漏洞请指出 int a[MAX], b[MAX], c[MAX];//用a[0]存储位数,bc同理 //假设a,b已经预处理好 c[0] = max(a[0], b[0]); for (int i = 1; i <= c[0]; i++) { c[i] += (a[i] + b[i]) % 10; c[i + 1] += (a[i] + b[i]) / 10; } //处理进位 while (c[c[0] + 1]) { c[c[0] + 2] += c[c[0] + 1] / 10; c[c[0] + 1] %= 10; c[0]++; } //反向输出即为答案 for (int i = c[0]; i; i--) { cout << c[i]; }
减法,乘法和除法与加法类似,这里不再赘述。
练习
P1009 阶乘之和(A+B&A*B)
挑战:P1080 国王游戏(涉及贪心,后续也会讲到)
3 大模拟挑战
模拟有时也会出得很变态。
以下几道大模拟做一道就差不多了。