markdown1# 智传民韵C++样题 题解 2 3## 题目分析 4 5本题要求根据给定的规则,将一串数字编码转换为对应纹样的字母标识,并统计各种纹样的数量。规则的核心是**多条件判断**,并且条件之间有**优先级顺序**。我们需要按照优先级依次判断每个数字的整除特性,输出对应字母,并累计计数。 6 7- **整除规则**: 8 - 能被 5 整除 → 铜鼓纹,标识 `T` 9 - 能被 12 整除 → 太阳纹,标识 `Y` 10 - 能被 9 整除 → 稻穗纹,标识 `D` 11 - 都不满足 → 基础平纹,标识 `P` 12- **优先级**:铜鼓纹 > 太阳纹 > 稻穗纹 > 基础平纹。 13 这意味着一旦满足较高优先级的条件,就不再判断较低优先级的条件。 14 15例如,数字 60 可以同时被 5、12 整除,但由于铜鼓纹优先级最高,应该输出 `T`。 16 17最后需要按格式输出统计结果:`T:X Y:Y D:Z P:W`(`X`、`Y`、`Z`、`W` 分别代表四种纹样的计数)。 18 19## 解题思路 20 21本题属于典型的**模拟题**,即直接根据题目描述逐步实现判断逻辑即可。 22 231. 读入整数个数 `n` 和 `n` 个整数。 242. 初始化四个计数器:`countT`、`countY`、`countD`、`countP`,均置为 0。 253. 遍历每个整数: 26 - 用 `if-else if-else` 结构实现优先级判断: 27 1. 如果整数能被 5 整除,输出 `T`,`countT` 加 1; 28 2. 否则,如果能被 12 整除,输出 `Y`,`countY` 加 1; 29 3. 否则,如果能被 9 整除,输出 `D`,`countD` 加 1; 30 4. 否则,输出 `P`,`countP` 加 1。 314. 遍历结束后,按照格式输出统计结果。 32 33需要注意: 34- 判断整除要用取模运算符 `%`,当 `num % k == 0` 时表示 `num` 能被 `k` 整除。 35- 由于优先级的设定,需要先判断能被 5 整除,再判断 12,再判断 9,**顺序不能调换**。 36- 输出字母时每个占一行,最后统计数量在一行内输出,格式与样例一致。 37 38## 算法说明 39 40我们可以将判断逻辑用一个简单的流程图表示: 41 421. 输入数字 `num` 432. 如果 `num % 5 == 0` → 输出 `T`,计数 T + 1 443. 否则如果 `num % 12 == 0` → 输出 `Y`,计数 Y + 1 454. 否则如果 `num % 9 == 0` → 输出 `D`,计数 D + 1 465. 否则 → 输出 `P`,计数 P + 1 47 48该过程对每个整数进行一次固定的判断,没有任何复杂的数据结构或算法,直接模拟即可。 49 50## 时间复杂度分析 51 52- 对 `n` 个整数,每个整数进行常数次(最多3次)取模和比较操作,因此时间复杂度为 **O(n)**。 53- 空间复杂度:可以用一个数组存储所有整数,空间复杂度为 O(n);也可以边读入边处理,空间复杂度 O(1)。题目中的 `n ≤ 100`,两种方式均可。 54 55## 参考代码 56 57下面是完整的 C++ 代码实现(与题面参考代码一致),并附有详细注释: 58 59```cpp 60#include <iostream> 61#include <vector> 62using namespace std; 63 64int main() { 65 int n; 66 cin >> n; // 读入整数个数 67 68 vector<int> nums(n); 69 for (int i = 0; i < n; i++) { 70 cin >> nums[i]; // 读入 n 个整数 71 } 72 73 // 初始化四种纹样的计数器 74 int countT = 0; // 铜鼓纹 75 int countY = 0; // 太阳纹 76 int countD = 0; // 稻穗纹 77 int countP = 0; // 基础平纹 78 79 // 遍历每个数字,按照优先级进行判断 80 for (int i = 0; i < n; i++) { 81 int num = nums[i]; 82 83 // 优先级1:能被5整除 → 铜鼓纹 T 84 if (num % 5 == 0) { 85 cout << "T" << endl; 86 countT++; 87 } 88 // 优先级2:能被12整除 → 太阳纹 Y 89 else if (num % 12 == 0) { 90 cout << "Y" << endl; 91 countY++; 92 } 93 // 优先级3:能被9整除 → 稻穗纹 D 94 else if (num % 9 == 0) { 95 cout << "D" << endl; 96 countD++; 97 } 98 // 优先级4:都不满足 → 基础平纹 P 99 else { 100 cout << "P" << endl; 101 countP++; 102 } 103 } 104 105 // 输出最终统计结果,格式:T:X Y:Y D:Z P:W 106 cout << "T:" << countT << " Y:" << countY 107 << " D:" << countD << " P:" << countP << endl; 108 109 return 0; 110}
cin >> n; 读取整数个数,然后利用 vector<int> nums(n) 创建一个动态数组,循环读入 n 个整数。int 变量分别记录四种纹样的出现次数,初始为 0。if (num % 5 == 0) 判断是否能被 5 整除。如果满足,输出 T 并计数,然后跳过后续判断(else if 保证不会进入其他分支)。else if (num % 12 == 0) 判断是否能被 12 整除,满足则输出 Y 并计数。D,否则输出 P。% 取模运算符,例如 num % 5 == 0,不要写成 num / 5 == 0。T:X Y:Y D:Z P:W,注意 T: 后紧接着数字,然后一个空格,再接 Y: 等。本题考察了基本的条件判断、优先级处理和循环遍历,是一道非常适合初学者练习的模拟题。只要理清判断顺序,代码实现就非常直观。通过此题可以熟悉 C++ 的输入输出、取模运算以及 if-else if-else 的使用方法。