[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 打印沙漏的主要内容,如果未能解决你的问题,请参考以下文章