手撕C语言题典——打印菱形

       作为C语言经典类型题,打印菱形是不少初学者很头疼的问题,但这题的本质其实就是找规律,结合图像会更容易理解。

     本章可能会用到的知识:

    C语言分支与循环(上)-CSDN博客

    利用分支与循环实现猜数字(下)-CSDN博客

      1.找 * 与空格的规律(菱形上半部分)

       

菱形的上半部分

        (因为规律是一致的,所以在此仅展示四行参考) 

         观察这半个菱形我们不难发现,空格和 * 的比:

  

* 与空格的关系
* 的个数空格的个数
第一行13
第二行32
第三行51
第四行70

           Ps:要特别注意一点就是空格仅需要计算最左边的,因为我们在打印的时候仅需要打印 * 之前的空格就好。

          由此表格我们不难发觉:a.空格数 = 总行数 - 当前行数

                                                  b. * 数 = 当前行数二倍 - 1

          如果我们假设菱形的总行数为 n ,当前行数为 i ,我们便可以把上面的公式抽象一下变成更适用于编译器的形式:a. ( n - i )( i>=1)

                                   b. ( 2 * i - 1)( i >=1)

        所以菱形的上半部分代码我们就可以这样写:

   for (int i = 1; i <= n; i++) {
        for (int j = 0; j < n - i; j++) {
            printf(" ");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
​

     2.找下半部分的规律

       由于下半部分就是上半部分倒过来,所以图就不展示了,大家可以自行想象,我们直接上结论:

                  a.空格 = 行数

                  b.* 数 = 下半总行数 - 行数的二倍加1

抽象一下就是:* 数 = 2( n - 1 - i )+1

                  ps:由于下半部分缺少最中间的那行所以总行数要减一

    so,下半部分代码就 very 简单了:

for (int i = 1; i <= n - 1; i++) {
        for (int j = 0; j < i; j++) {
            printf(" ");
        }
      for (int j = 0; j < 2 * (n - 1 - i) + 1; j++) {
            printf("*");
        }
        printf("\n");
    }

3.总结 

    完整代码只需要定义一下 n //上半部分行数

    以下是完整代码:

#include<stdio.h>

int main() {
    int n;
    scanf(“%d”,&d);
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < n - i; j++) {
            printf(" ");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    for (int i = 1; i <= n - 1; i++) {
        for (int j = 0; j < i; j++) {
            printf(" ");
        }
      for (int j = 0; j < 2 * (n - 1 - i) + 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

  🎈🎈完结撒花🎈🎈

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值