B3888 [语言月赛 202311] 画图练习 题解

· · 题解

Source & Knowledge

2023 年 11 月语言月赛,由洛谷网校入门计划/基础计划提供。

考察循环嵌套结构、质数的定义。

文字题解

这道题目是一道典型的输出字符画像的题目,考察了循环嵌套结构。

首先,我们外层循环变量 i 控制行数,内层循环控制列数。但本题与寻常的题目并不一样——本题要求每一列输出 i^2 个非空白字符,而且计算中和列数也是有关系的。因此内层循环需要定义两个变量进行循环,一个是 j——表示输出了第几个字母,一个是 k——表示这是第几列。

在这里,一个常见的问题是,如何获取当前本应填充的字母的 ASCII 码?假设我们用变量 ch 存储当前本应填充的字母,那么 ch 在进行算术运算时,其自动代入的就是 ch 这个字母的 ASCII 码值。例如说:int x=k+ch,就表达出了当前列数加上当前本应填充的字母的 ASCII 码的含义。由于大写字母的 ASCII 码值连续,因此我们可以直接使用 char ch='A'+i-1 的方式,获取第 i 行开头的字母是哪一个。

下一个关键点是质数。让我们回顾一下质数的定义:

一个质数是指,不能被 1 和自身以外的正整数所能整除的正整数。

根据这个定义,对于一个正整数 x,我们总能写出一个循环语句去判断其是否是质数:

bool flag=true;//如果 flag 为 true,则 x 是质数,否则 x 不是质数。
for (int j=2;j<=x-1;j++) {
    if (x%j==0) //从 2 到 j-1,一个一个试除 x,判断能否整除 x。
        flag=false;//如果能整除,说明 x 不是质数。
}

我们可以根据此,判断当前列数加上当前本应填充的字母的 ASCII 码是否为质数。如果是,则输出这个字母,并且让字母变为下一个字母。否则输出空格。

详细的代码请参考视频题解。