输出实心和空心菱形(C++)

输入一个n,表示两个菱形图形(实心和空心)的行数(或者一半行数),利用循环语句实现输出。

题目:

输入一个n,表示两个菱形图形(实心和空心)的行数(或者一半行数),利用循环语句实现输出。

示例输入:

3

示例输出(这里设输入的为菱形的行数):

 * 
***
 *
 *
* *
 *

首先需要明确的是,在这种情况下输入的数字必须是个奇数,不然不构成菱形。
设行数为 n n n则总宽度: n n n上半部分的行数(不包括中间一行): n − 1 2 \frac{n-1}{2} 2n1那么第 i i i行的‘*’个数为: 2 i − 1 2i-1 2i1
因此我们得到第 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(2i1)+1=2n+1i+1 n − n − ( 2 i − 1 ) 2 = n − 1 2 + i n-\frac{n-(2i-1)}{2}=\frac{n-1}{2}+i n2n(2i1)=2n1+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} 2n1行,原本的最后一行就变成了第 n − 1 2 \frac{n-1}{2} 2n1行,显然它们的绝对值是一样的!
那么第 i i i行的’*'的个数就是 n − 2 ∣ i ∣ n-2|i| n2i
那么原本的第i行的第一个“*”和最后一个“*”的位置变为 n − ( n − 2 ∣ i ∣ ) 2 + 1 = ∣ i ∣ + 1 \frac{n-(n-2|i|)}{2}+1=|i|+1 2n(n2i)+1=i+1 n − n − ( n − 2 ∣ i ∣ ) 2 = n − ∣ i ∣ n-\frac{n-(n-2|i|)}{2}=n-|i| n2n(n2i)=ni

为方便观察,在这里用’+‘代替空格,很容易找出’*'的个数与 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 后也得改为输出两个空格,即" "。

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值