XTU-OJ 《C语言程序设计》 1403-菱形 I

菱形

题目描述

按照给定小菱形的数量n,利用字符打印菱形,要求

  1. 只使用/\,空格,回车四种字符。
  2. 行首无多余的空格,行末无空格。
  3. 菱形从上到下,从左到右,依次编码,从1到n,不要输出多余的菱形。
  4. 边长为a的大菱形,最少有(a−1)2+1个小菱形,最多有a2个小菱形。

具体格式见样例。

比如边长为3的菱形,最少有5个小菱形(左边的情况),最多有9个小菱形(右边的情况)。

   /\      /\
  /\/\    /\/\
 /\/\/   /\/\/\
 \/\/    \/\/\/
          \/\/
           \/

对应的编号分别为

  1     1
 2 3   2 3
4 5   4 5 6
       7 8
        9

输入格式

存在多个样例,每个样例是一个整数n(1≤n≤100)。如果n为0,表示输入结束,这个样例不需要处理。

输出格式

依次按要求输出对应数量的菱形。

样例输入

1
2
3
4
5
6
7
0

样例输出

/\
\/
 /\
/\/
\/
 /\
/\/\
\/\/
 /\
/\/\
\/\/
 \/
  /\
 /\/\
/\/\/
\/\/
  /\
 /\/\
/\/\/\
\/\/\/
  /\
 /\/\
/\/\/\
\/\/\/
 \/

解题思路:  型如此类的的题目,都是要让我们找出规律,然后打表生成目标图案。本题图案的特点

1. 图案分为上下两个部分,上部分由 “/\”和“/” 两种符号组成,下部分由 “\/” 组成。

2. 边长为a的大菱形,上部分一定有a层。并且由  “/\”和“/” 就可以组成一个完整的小菱形(下部分其实也是)。

3. 菱形中,一个“/\” 或 “\/” 就可以代表有一个小菱形。

4. 上下两部分分隔处,相对应的  “/\” 和 “\/”  代表的是同一个小菱形。

5. 上下两部分每层小菱形最大数都是 序列递增/递减的。(第1层最多1个,第2层最多2个,第3层最多3个...)

知道上面5个特点,现在就可以针对性编程了。(结合代码注释)

AC代码:

#include <stdio.h>

int main()
{
    int n,a,t;
    while (scanf("%d",&n) && n != 0)
    {
        t = n;
        for (a = 1; n > a*a; a ++);            // 求出大菱形边长a
        for (int i = 1; i <= a; i ++)          // 打印上部分
        {
            for (int j = 0; j < a-i; j ++)  printf(" ");    // 留空格
            if (t >= i)                  /*如果每层小菱形数都能表示满,则都打印/\ */ 
            {
                for (int k = 0; k < i; k ++)
                    printf("/\\");
            }
            else                         /*如果最后一层小菱形数不表示满,则最后要多打印个"/" */ 
            {                            /*最后那个 "/" 同前面那个"/\"中的 "\" 
                                           形成一个"\/"与上面一层的"/\" 组成一个完整的小菱形*/
                for (int k = 0; k < t; k ++)
                    printf("/\\");
                printf("/");
            }
            t -= i;
            puts("");
        }
        t = n-((a-1)*a)/2;              // 结合特点4,上部分已经打印了前a-1层个数量的小菱形
                                        // 还剩下 n-(累加数列的前n-1项和) 个小菱形需要打印   
        for (int i = a; i >= 1; i --)               // 打印下部分
        {
            if (t <= 0 )    break;
            for (int j = 0; j < a-i; j ++)  printf(" ");
            if (t >= i)
                for (int k = 0; k < i; k ++)
                    printf("\\/");
            else
                for (int k = 0; k < t; k ++)
                    printf("\\/");
            t -= i;
            puts("");
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值