B2025题解

· · 题解

本题是一道非常简单的入门题,直接输出相应图案即可,相应做法其他题解多有阐述。这里我想给出一种较为通用的做法,使得程序对于给定的奇数n,可以输出对角线长n个字符,倾斜放置的菱形。

不难发现,按照题目要求,程序输出的每一行内容都由空格和星号组成。所以问题转化成「对于第i行,应该先输出多少个空格,再输出多少个星号?」

前者的答案是显而易见的,每行的空格数和星号数都是奇数,因此第i行应有|\frac{n-1}{2}-i|个空格。然而,对于i < \frac{n-1}{2}i>\frac{n-1}{2}的情况,星号数的表达式却并不一致——第i行的星号数是一个分段函数:

f(i)=\begin{cases}2i+1 & i \leq \frac{n-1}{2}\\ 2(n-i-1)+1 & i > \frac{n-1}{2}\end{cases}

不太好看,我们可以把它也变成像空格数表达式一样好看的绝对值形式:-\left|2\left(i-\frac{n-1}{2}\right)\right|+5

容易发现,两个问题的本质是一样的,只是后者的对称轴不在y轴上,为我们带来了一点麻烦。接下来就可以开始写代码了。

#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
    int n = 5;//将5换为其他数字即可实现任意对角线长度。
    for(int i = 0;i < n;i++)
    {
        for(int j = 0;j < abs((n-1)/2-i);j++)
            printf(" ");
        for(int j = 0;j < (-1*abs(2*(i-(n-1)/2))+5);j++)
            printf("*");
        printf("\n");
    }
}