PAT乙级考试-1027 打印沙漏

题目
在这里插入图片描述
在这里插入图片描述
思路
本题的关键在于弄清楚行数和每行应该打印的符号的个数;
(1)首先求出应该打多少行和打完剩余的个数,这里我设定的参数是n为除沙漏中间一行外两边增加的行数,即总行数=2n+1;
(2)通过数列的知识不难求出在给定的符号数量下n的最大值,有了这个层数数据后,再找出每一层应该打的符号数量和层数i的关系;
(3)这里我将其分为上面的n层和下面的n-1层,对于上下的任意一层第i层,都有先打印n-i-1个空格,再打印2
i+1个符号的关系;注意每一行的左边打出空格即可,右边不需要打;

#include<stdio.h>

int main(void)
{
	int a, n;
	char c;
	scanf("%d %c", &a, &c);
	for (n = 1; 1 + 2 * (n + 1) * (n - 1) <= a; n++);//n为除去中间后两侧增加的层数,即总层数=2*n+1
	n = n - 1;
	a = a - (1 + 2 * (n + 1) * (n - 1));//a用来存放剩余符号的个数
	for (int i = n - 1; i >= 0; i--)
	{
		for (int j = 0; j < n - i-1; j++)
			printf(" ");
		for (int j = 0; j < 2 * i + 1; j++)
			printf("%c", c);
		printf("\n");
	}
	for (int i = 1; i <= n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
			printf(" ");
		for (int j = 0; j < 2 * i + 1; j++)
			printf("%c", c);
		printf("\n");
	}
	printf("%d", a);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值