输入一个n,表示两个菱形图形(实心和空心)的行数(或者一半行数),利用循环语句实现输出。
题目:
输入一个n,表示两个菱形图形(实心和空心)的行数(或者一半行数),利用循环语句实现输出。
示例输入:
3
示例输出(这里设输入的为菱形的行数):
*
***
*
*
* *
*
首先需要明确的是,在这种情况下输入的数字必须是个奇数,不然不构成菱形。
设行数为
n
n
n则总宽度:
n
n
n上半部分的行数(不包括中间一行):
n
−
1
2
\frac{n-1}{2}
2n−1那么第
i
i
i行的‘*’个数为:
2
i
−
1
2i-1
2i−1
因此我们得到第
i
i
i行的第一个‘*’和最后一个‘*’的位置为
n
−
(
2
i
−
1
)
2
+
1
=
n
+
1
2
−
i
+
1
\frac{n-(2i-1)}{2}+1=\frac{n+1}{2}-i+1
2n−(2i−1)+1=2n+1−i+1和
n
−
n
−
(
2
i
−
1
)
2
=
n
−
1
2
+
i
n-\frac{n-(2i-1)}{2}=\frac{n-1}{2}+i
n−2n−(2i−1)=2n−1+i(每一行从左往右开始数 )
所以上半部分(不包括中间一行):
int n;//总行数
std::cin >> n;
for (int i = 1; i <= (n-1)/2; ++i)//第i行
{
for (int j = 1; j <= n; ++j)//第i行第j列
{
if (j >= (n+1)/2-i+1 && j <= (n-1)/2+i)//如果处于第一个"*"和最后一个"*"之间,就输出"*"
std::cout << "*";
else
std::cout << " ";///否则输出空格
}
std::cout << std::endl;
}
那么下一半怎么办呢?其实我们可以发现第一行和最后一行其实是对称的,我们可以把中间一行看作第0行,那么原本的第一行就变成了第
−
n
−
1
2
-\frac{n-1}{2}
−2n−1行,原本的最后一行就变成了第
n
−
1
2
\frac{n-1}{2}
2n−1行,显然它们的绝对值是一样的!
那么第
i
i
i行的’*'的个数就是
n
−
2
∣
i
∣
n-2|i|
n−2∣i∣
那么原本的第i行的第一个“*”和最后一个“*”的位置变为
n
−
(
n
−
2
∣
i
∣
)
2
+
1
=
∣
i
∣
+
1
\frac{n-(n-2|i|)}{2}+1=|i|+1
2n−(n−2∣i∣)+1=∣i∣+1和
n
−
n
−
(
n
−
2
∣
i
∣
)
2
=
n
−
∣
i
∣
n-\frac{n-(n-2|i|)}{2}=n-|i|
n−2n−(n−2∣i∣)=n−∣i∣
为方便观察,在这里用’+‘代替空格,很容易找出’*'的个数与
i
i
i的关系:
最终代码为:
#include<iostream>
#include<cmath>
int main()
{
int n;
std::cin>>n;
for (int i = (1-n)/2; i <= (n-1)/2; i++)
{
for (int j =1; j <=n; j++)
{
if (j >= abs(i)+1 && j <= n-abs(i))
std::cout<<"*";
else
std::cout << " ";
}
std::cout << std::endl;
}
}
空心菱形只须将if
语句改为:
if (j == abs(i)+1 || j == n-abs(i))
即可。
另外,如果想输出的更像正方形一样,可以把‘*’改为‘* ’,多加一个空格,另外 else 后也得改为输出两个空格,即" "。