week3-[分支结构]2023
题目描述
读入一个四位数 nnn,判断该四位数的四个数码(千位、百位、十位、个位)任意重新排列后(可以与原数相同),是否可能形成四位数 202320232023。
输入格式
输入共 111 行,该行包括 111 个四位数 nnn。
输出格式
输出只有 111 行,如果四位数 nnn 的四个数码重新排列能形成 202320232023,则输出 "Yes",否则输出 "No"(输出时不需要输出引号)。
样例 #1
样例输入 #1
3202
样例输出 #1
Yes
样例 #2
样例输入 #2
2413
样例输出 #2
No
样例 #3
样例输入 #3
2023
样例输出 #3
Yes
样例 #4
样例输入 #4
2230
样例输出 #4
Yes
提示
样例解释1
320232023202 按百位、十位、个位、千位的顺序重新排列,可以形成 202320232023。
样例解释2
241324132413 的四个数码无论怎样重新排列,都不可能变为 202320232023。
样例解释3
输入的数本身就是 202320232023,任意重新排列后自然也可以产生 202320232023。
样例解释4
223022302230 按千位、个位、百位、十位的顺序重新排列,可以形成 202320232023。
数据范围
对于所有数据,1000≤n≤99991000 \le n \le 99991000≤n≤9999。
解题思路
- 分解数码:把输入的四位数拆成个位、十位、百位、千位。
- 统计数字频率 :用一个数组
cnt[10]
记录每个数字出现的次数。 - 对比目标频率 :我们知道
2023
→2
出现 2 次,0
出现 1 次,3
出现 1 次。- 如果输入的数码统计结果跟这个完全一样 → 输出
"Yes"
- 否则 → 输出
"No"
- 如果输入的数码统计结果跟这个完全一样 → 输出
C++参考代码
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int cnt[10] = {0};
// 分解数码
int x = n;
for (int i = 0; i < 4; i++) {
cnt[x % 10]++;
x /= 10;
}
// 目标 "2023" 的频率
int target[10] = {0};
target[2] = 2;
target[0] = 1;
target[3] = 1;
bool ok = true;
for (int d = 0; d <= 9; d++) {
if (cnt[d] != target[d]) {
ok = false;
break;
}
}
cout << (ok ? "Yes" : "No") << endl;
return 0;
}