PAT-B 1027 列印沙漏 【模擬】

Enjoy_process發表於2019-02-22

                                               PAT-B 1027 列印沙漏

                    https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328

 

 

題目

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印

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

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。給定任意N個符號,不一定能正好組成一個沙漏。要求列印出的沙漏能用掉儘可能多的符號。

輸入

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出

首先列印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

樣例輸入

19 *

樣例輸出

*****
 ***
  *
 ***
*****
2

分析

先列印上半部分,然後列印下半部分。設符號數為1的行為第1行,向上向下行數依次遞增,由於上下部分對稱且變化符合等差數列,因此易求得t行的圖案(上半部分或下半部分有t行)共有2*t*t-1個元素,因此只要求出2*t*t-1<=n的最大t就知道上下部分的行數以及剩餘的符號數量。註釋很詳細,具體看程式。
    

C++程式

#include<iostream>
#include<cmath>

using namespace std;

int main()
{
	int n;
	char c;
	scanf("%d %c",&n,&c);
	int t=sqrt((n+1)/2);//符號數從大到小順序遞減到1共t行
	//列印上半部分 
	for(int i=t;i>=1;i--)//第i行的符號數為 2*i-1 ,每行前面的空格數為 t-i個 
	{
		for(int j=1;j<=t-i;j++)//列印每行前面的空格 
		  putchar(' ');
		for(int j=1;j<=2*i-1;j++)//列印每行的符號c 
		  putchar(c);
		putchar('\n');
	} 
	//列印下半部分
	for(int i=2;i<=t;i++)
	{
		for(int j=1;j<=t-i;j++)//列印每行前面的空格 
		  putchar(' ');
		for(int j=1;j<=2*i-1;j++)//列印每行的符號c 
		  putchar(c);
		putchar('\n');
	}
	printf("%d\n",n-(2*t*t-1));
	return 0; 
}

 

相關文章