【PAT B1027】打印沙漏(C语言)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好玩

/* 
 *  2*n-1=len;		等差数列求和公式 n*(1+n)/2
 *	2*3-1=5			所以 n*(1+len)/2 = n*n;  2*n*n-1 = 沙漏总个数;
 *	2*2-1=3			所以 len = 2*n-1; len 是第一行要输出的个数 
 *	2*1-1=1
 *	2*2-1=3
 *	2*3-1=5
 *  2*n-1=len;
 */
#include <stdio.h>
char c;
int len;					/* 沙漏第一行要输出多少个  */
int remain;					/* 剩了多少个 */
/*------------------------ 计算图形,并合理的在数组中分布 ---------------------*/
int cal_len ()
{
	int N, i;

	scanf ("%d %c", &N, &c);
	for (i = 1; i*i <= ((N+1)/2); ++i);
	--i;
	len = 2*i-1;
	remain = N - (2*i*i - 1);
	return 0;
}
/*---------------------------- 输出结果 --------------------------------------*/
int print_result ()
{
//	printf("len = %d remain = %d\n", len, remain);
	int i, j, k, m;

	k = 0;	/* 每一行开始打印几个空格 */
	for (i = len; i > 1; i -= 2)	/* 一行一行打印,每一行比前一行少两个 */
	{
		m = k;
		for (j = i; j > 0; --j)
		{
			for (; m > 0; --m)/* 打印每行开始的空格 */
				printf(" ");
			putchar(c);
		}
		++k;
		printf("\n");
	}
	for (i = 1; i <= len; i += 2)
	{
		m = k;
		for (j = i; j > 0; --j)
		{
			for (; m > 0; --m)
				printf(" ");
			putchar(c);
		}
		--k;
		printf("\n");
	}
	printf("%d", remain);
	return 0;
}
int main ()
{	
	cal_len ();
	print_result ();
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值