题解
一道关于字符输出膜拟题!
我们发现它是一个上下(当然左右也是,只是C++
默认不是竖着输出)对称的图形,并且最中间一行(记得n是奇数)根本没有*
,我们就假设那一行为第0行。
那么共有n行,分别为第 ( -\frac{n}{2}) - (\frac{n}{2} ) 行(此处n为整型,所以除以2自动取整)。
则发现在第i( ( -\frac{n}{2} ) \leq{i}\leq{ ( \frac{n}{2} ) })行左边(第一个D
左边)有\vert{i}\vert个*
(别忘了绝对值),右边也是;而中间则有n-2\vert{i}\vert个D
,共n个字符。
所以只需要循环输出即可!
代码
#include<stdio.h>
int n,k;
int abs(int x) //绝对值
{
return x>0? x:-x;
}
int main()
{
scanf("%d",&n);
k=n>>1; //k为n的一半
for(register int i=-k;i<=k;++i) //i的范围
{
for(register int j=0;j<abs(i);++j) putchar('*'); //|i|个*
for(register int j=0;j<(n-abs(i<<1));++j) putchar('D'); //n-2|i|个D
for(register int j=0;j<abs(i);++j) putchar('*'); //|i|个*
putchar('\n');
}
return 0;
}
说明
关于本篇涉及到的位运算的讲解(其实就一种,大佬们肯定都会)
x>>1
表示x/2
,其实x>>i =\frac{x}{2^{i}}。
x<<1
表示x*2
,其实x<<i =x\times{2^{i}}。