菱形
题目描述
按照给定小菱形的数量n,利用字符打印菱形,要求
- 只使用
/
,\
,空格,回车四种字符。- 行首无多余的空格,行末无空格。
- 菱形从上到下,从左到右,依次编码,从1到n,不要输出多余的菱形。
- 边长为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;
}