上下金字塔

学习for循环后对于嵌套循环中for中的数值设置很模糊,于是在牛客上找了一道训练的题目

题目描述:就输入的数字输出特定的金字塔

输入描述:2,5

输出描述:

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

题目分析:显然是for的嵌套循环,就我浅薄的理解,for的外层循环代表的是行而内层循环表示的是列。我在写的过程中琢磨怎么进行数据的输入的过程中,我慢慢发现观察将抽象的格式变化转换为具体的数字变化后可以更好地变为程序。例如观看如图给的输出描述,可以把图像转化为语言和数字的描述:单个图像为一个菱形,对于2而言空格的数字规律是1,0,1;*的规律为1,3,1;对于5而言空格的数字规律是4,3,2,1,0,1,2,3,4;*的规律是1,3,5,7,9,7,5,3,1。转化为程序中,我认为在for中选择<可以优化我的思路选择,再根据数字的规律可以更好地得出答案。有个小点,就是这种变化的规律一般都会用上内循环for中设定的变量,在列的重复中,可以根据列的改变从而改变自己的数字。

以下给出我的答案:

#include<cstdio>
int main()
{
    int a;
    while(scanf("%d",&a)!=EOF){ //因为只会单调增加所以采用只打印上半部的模式
        for(int b=1;b<a+1;b++)//多少行
        {
            for(int c=0;c<a-b;c++)//多少列(先打空格)
                printf(" ");
            for(int d=0;d<2*b-1;d++)
                printf("*");
            printf("\n");
        }
        for(int b=1;b<a;b++)
        {
            for(int c=0;c<b;c++)
                printf(" ");
            for(int d=0;d<(2*a-1-2*b);d++)
                printf("*");
            printf("\n");
        }
    }
    return 0;
}

值得一题的是,我将整个菱形分为了上下两部分三角形输出。这是因为我目前学到的简单for循环只能单调将自身所有的变量递增,递增就无法将输出的空格或者*字符在某个节点将本来递增的势头转变为递减。因此可以想到选择使用两个三角形。

小于号并且将初始值定义为0就表明了可以输出小于号右侧的个数。让我们来尝试分析2的数字规律,首先明确是有变化的,所有存在内层循环的变量,数字规律的变化倍数为1,所以内循环变量的倍数也为1。再它是递减,所以对变量前的符号使用-号。再用2和5两种输入案例分析,就可以得到a-b的程序数据。同理对于*号的数字,可以看出每次递增2,可以使用+2b来描述,再根据第一行的数据,可以得到2b-1的程序数据。下面同理。

总结:观察总结是学习必不可少的一部分,只有多写多总结才能明白更多

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值