PAT-B 1027 列印沙漏 【模擬】
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;
}
相關文章
- 1027 列印沙漏 (20分)
- 【PAT乙級】1027 列印沙漏
- L1-002 列印沙漏
- PTA-7-82 列印沙漏
- PAT-B 1058 選擇題 【模擬】
- PAT-B 1061 判斷題【模擬】
- PAT-B 1067 試密碼【模擬】密碼
- PAT-B 1071 小賭怡情【模擬】
- PAT-B 1054 求平均值 【模擬】
- PAT-B 1072 開學寄語【模擬】
- PAT-B 1081 檢查密碼【模擬】密碼
- PAT-B 1084 外觀數列 【模擬】
- PAT-B 1085 PAT單位排行【模擬】
- PAT-B 1018 錘子剪刀布 【模擬】
- 谷歌工具模擬列印媒體谷歌
- PAT-B 1019 數字黑洞【陣列+模擬】陣列
- PAT-B 1017 A除以B【模擬 大數除法】
- PAT-B 1059 C語言競賽【模擬】C語言
- PAT-B 1024 科學計數法【模擬+字串】字串
- PAT-B 1077 互評成績計算【模擬】
- PAT-B 1012 數字分類【簡單模擬】
- PAT-B 1025 反轉連結串列【模擬+對映】
- PAT-B 1069 微博轉發抽獎【模擬+集合】
- php 1027PHP
- PAT-B 1008 陣列元素迴圈右移問題【簡單模擬】陣列
- PAT-B 1001 害死人不償命的(3n+1)猜想【模擬】
- PAT-B 1002 寫出這個數 【字串+遞迴列印】字串遞迴
- PAT-B 1006 換個格式輸出整數【遞迴列印】遞迴
- 實現一個沙漏⏳元件元件
- 模擬
- 2024.11.20 NOIP模擬 - 模擬賽記錄
- 10.6 模擬賽(NOIP 模擬賽 #9)
- PAT-B 1036 跟奧巴馬一起程式設計【列印圖案】程式設計
- 有限元模擬 有限體積模擬
- 【電子沙漏】製作相關例程
- 模擬賽
- 模擬題
- ACP模擬