week3-[分支结构]2023

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。

解题思路

  1. 分解数码:把输入的四位数拆成个位、十位、百位、千位。
  2. 统计数字频率 :用一个数组 cnt[10] 记录每个数字出现的次数。
  3. 对比目标频率 :我们知道 20232 出现 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;
}