PAT训练-1027. 打印沙漏(20)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

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

代码:

//

//  main.cpp

//  test

#include <iostream>

#include <queue>

#include <iomanip>

#include <math.h>

#include <vector>

#include <string>

#include <algorithm>

#include <map>

using namespace std;

int main(int argc, const char * argv[]) {

    int count = 0;

    cin>>count;

    char op;

    cin>>op;

    int temp = 1;

    int i = 1;

    while(temp < count)

    {

        i++;

        temp = temp + 2*(2*i –1);

    }

    if(temp!=1)

    {   temp = temp – 2*(2*i –1);

        i–;

    }

    for(int j = i;j >= 2;j–)

    {

        int k = (2*i –11)/2 – (2*j –2)/2;

        for(;k>=1;k–)

            cout<<” “;

        for(k = 2*j-1;k>=1;k–)

            cout<<op;

        cout<<endl;

    }

    for(int k = 0;k<i-1;k++)

        cout<<” “;

    cout<<op<<endl;

    for(int j = 2;j <= i;j++)

    {

        int k = (2*i –11)/2 – (2*j –2)/2;

        for(;k>=1;k–)

            cout<<” “;

        for(k = 2*j-1;k>=1;k–)

            cout<<op;

        cout<<endl;

    }

    cout<<count-temp;

    

}

发表评论