1027. 列印沙漏(20)-PAT乙級真題
阿新 • • 發佈:2021-02-18
技術標籤:團體程式設計天梯賽-練習集PAT乙級
傳送門
題面
本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
ac程式碼:
#include<iostream>
using namespace std;
int main()
{
int n,row,p;char ch;//row是行數,p是surplus剩餘量.
cin>>n>>ch;
while(2*row*row+4*row+1<n)
row++;//以n=19為例,while結束後i=3,上三角和下三角都有三行.
row--,p=n-(2*row*row+4*row+1);//計算剩餘量
for(int i=0;i<=row;i++)
{
for(int j=0;j<i;j++)//先輸出空格:空格數和i相同
printf(" ");
for(int j=2*i;j<row*2+1;j++)//輸出符號,符號數固定為 (row*2+1)(常量)-(2*i)(變數)
cout<<ch;
puts("");//換行
}
for(int i=row-1;i>=0;i--) //已經輸出上半部分的情況下,如何快速輸出下半部分:
{ //其他條件不變,最外層迴圈條件i倒轉即可
for(int j=0;j<i;j++)
printf(" ");
for(int j=2*i;j<row*2+1;j++)
cout<<ch;
puts("");
}
printf("%d",p);//輸出剩餘量
}
後記
歸類:圖形題,規律題
同類題:
列印菱形圖案
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n/2;i++)
{
for(int j=i;j<=n/2;j++)
printf(" ");
for(int j=1;j<=2*i-1;j++)
printf("* ");
puts("");
}
for(int i=n/2+1;i>=1;i--)
{
for(int j=i;j<=n/2;j++)
printf(" ");
for(int j=1;j<=2*i-1;j++)
printf("* ");
puts("");
}
}
z字形掃描
用到了填充的思想