1. 程式人生 > 其它 >pat 乙級 1027 列印沙漏(C++)

pat 乙級 1027 列印沙漏(C++)

技術標籤:pat 乙級c++

題目

本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印
在這裡插入圖片描述
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:

19 *

輸出樣例:

在這裡插入圖片描述

分析

  • 從中間看,沙漏本質上是一個首項為1,公比為2的等差數列。
  • 通項公式an=a1+(n-1)d,前n項和Sn=a1+n(n-1)*d/2。代入首項和公比,an=2n-1,Sn=n2.
  • 一個沙漏的總字元數=2Sn-1=2n2-1,再由輸入的字元數可計算出剩餘字元個數。

AC程式碼

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int i,j,N;
    char c;
    cin>>N>>c;
    double a=(double)(N+1)/2;
    int num=floor(sqrt(a));
    //上半部分
for(i=num;i>=1;i--) { for(j=0;j<num-i;j++) cout<<" "; for(j=0;j<2*i-1;j++) cout<<c; // for(j=0;j<num-i;j++) // cout<<" "; cout<<endl; } //下半部分 for(i=2;i<=num;i++) {
for(j=0;j<num-i;j++) cout<<" "; for(j=0;j<2*i-1;j++) cout<<c; // for(j=0;j<num-i;j++) // cout<<" "; cout<<endl; } cout<<N-(2*num*num-1); }

剛開始每行字元後面加了空格,後面提示"格式不對"。然後,只要求符號中心對齊,並沒有要求後面的空格。也就是說,做題的時候,要緊跟題意,不要過於理解。

如果這篇文章對你有幫助,動動可愛的小手點個讚唄!
有任何問題,歡迎評論區交流。