【解析】习题4-9 打印菱形图案 | C语言实现 | PTA

本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:
输入在一行中给出一个正的奇数n。

输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

7

输出样例:

      * 
    * * * 
  * * * * * 
* * * * * * * 
  * * * * * 
    * * * 
      * 

评价:
卧槽……这玩意真的写的我脑汁都快没了,看了其他大神写的感觉自己写的还是不那么美,但总归是写出来了,以下是代码:

#include <stdio.h>
int main() {
    int n;
    if (scanf("%d", &n)) {};
    for (int i = 1,b = n-1; i <= (n / 2) + 1; i++,b -= 2) {
        for (int m = 1; m <= b; m++) {
            printf(" ");
        }
        for (int t = 1; t <= 2 * i - 1; t++) {
            printf("* ");
        }
        printf("\n");
    }
    for (int i = 1,b = 0,a = n; i <= n / 2 + 1; i++,b += 2,a -= 2) {
        if (i != 1) {
            for (int m = 1; m <= b; m++) {
                printf(" ");
            }
            for (int t = 1; t <= a; t++) {
                printf("* ");
            }
            printf("\n");
        }
    }
    return 0;
}


简单分析下原理,我这边的实现方式是,先尝试输出半个菱形,再修改算法让他倒着输出,然后通过if不输出中间那一行;这是整体的原理。
下面说以下局部的原理,对于每一行,他实质上是这样组成的:“一堆空格”+若干个“* ”(注意后面是有空格的)
而为了让他形成类似菱形的排布,我们可以通过观察示例中给的7行菱形看到以下规律:
我们只看上半部分的情况下,也就是1~4行:
1.每一行的空格到中间空格数量递减顺序为: 6、4、2、0
2.每一行的
到中间的*的数量递增顺序为:1、3、5、7
于是我们就安排循环嵌套循环就大致实现了半个菱形的输出。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值