1.4.3 密码运算
题目考查
模拟 枚举
解题思路
模拟题, 特点是通常题意不是很难, 但是代码实现并不是很容易. (但这个题还好, 代码不长)
很显然, 我们需要模拟乘法算式, 要求在运算过程中出现的所有数字均给出, 且长度符合题意.
我们假设进行相乘的数字为a和b, a的长度为3, b的长度为2, 所以a ∈[100, 999], b ∈[10, 99]. 不妨枚举所有可能的a和b取值, 然后判断a*b是否合法即可.
题目细节
- 注意题目中一共有5处需要检查数字是否都给出.
- 我们可以通过之前学习的to_string()函数来简化代码, 得到一个数字的长度.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
bool vis[15];
bool check(int x) {
do {
if (!vis[x % 10]) return 0;
x /= 10;
} while (x);
return 1;
}
bool fact(int x, int len) { return to_string(x).size() == len; }
int main()
{
int n; cin >> n;
rep(i, n) {
int x; scanf("%d", &x);
vis[x] = 1;
}
int res = 0;
for (int a = 100; a <= 999; ++a) {
for (int b = 10; b <= 99; ++b) {
if (!check(a) or !check(b)) continue;
int c = a * (b % 10), d = a * (b / 10);
int e = c + d * 10;
if (!check(c) or !check(d) or !check(e)) continue;
if (fact(c, 3) and fact(d, 3) and fact(e, 4)) res++;
}
}
cout << res << endl;
return 0;
}