[PTA]自测-1 打印沙漏

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]自测-1 打印沙漏相关的知识,希望对你有一定的参考价值。

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2
  • 提交结果:

在这里插入图片描述

  • 源码:
#include<stdio.h>
int main(void)
{
	int N;
	char ch;

	int signSum = 1;	// 用掉的符号总个数
	int signRow = 1;	// 每一行的符号个数

	scanf("%d %c", &N, &ch);

	// while循环求得用掉的符号总数signSum, 每一行的符号个数signRow
	while (signSum <= N)
	{
		signRow += 2;
		signSum += signRow * 2;
	}
	// 循环多执行1次,故需做如下处理
	signSum -= signRow * 2;
	signRow -= 2;

	// 分析可知,此时行数等于最大行的符号个数也即第一行的符号个数
	int row = signRow;

	// 先输出沙漏的上半部分
	for (int i = 1; i <= row / 2; i++)
	{
		// 先输出每一行前的空格个数,最大行符号个数减去当前行的符号个数除以2
		for (int j = 1; j <= (row - signRow) / 2; j++)
		{
			printf(" ");
		}
		// 输出每一行的符号个数
		for (int k = 1; k <= signRow; k++)
		{
			printf("%c", ch);
		}
		printf("\\n");
		// 下一行的符号个数比上一行少两个(上半部分沙漏)
		signRow -= 2;
	}

	// 输出沙漏的最中间一行
	for (int i = 1; i <= (row - signRow) / 2; i++)
	{
		printf(" ");
	}
	printf("%c\\n", ch);

	// 输出沙漏的下半部分
	for (int i = 1; i <= row / 2; i++)
	{
		// 下一行的符号个数比上一行的符号个数多2(沙漏下半部分)
		signRow += 2;

		// 每一行前的空格,最大行符号个数减去当前行符号个数除以2
		for (int j = 1; j <= (row - signRow) / 2; j++)
		{
			printf(" ");
		}

		// 输出当前行的符号个数
		for (int k = 1; k <= signRow; k++)
		{
			printf("%c", ch);
		}
		printf("\\n");
	}

	// 输出剩余未使用的符号个数
	printf("%d", N - signSum);

	return 0;
}

以上是关于[PTA]自测-1 打印沙漏的主要内容,如果未能解决你的问题,请参考以下文章

自测-1 打印沙漏 (20 分)

自测-1 打印沙漏 (20分)

PTA(Basic Level)1027.打印沙漏

PTA编程总结 沙漏

PTA编程总结1

PTA编程总结1