美文网首页
【PAT-乙级-C++】1027. 打印沙漏(20)

【PAT-乙级-C++】1027. 打印沙漏(20)

作者: linghugoogle | 来源:发表于2018-01-22 00:13 被阅读63次

    1027. 打印沙漏(20)

    时间限制
    200 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    1、题目

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

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

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

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

    输入格式:

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

    输出格式:

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

    输入样例:
    19 *
    输出样例:
    *****
     ***
      *
     ***
    *****
    2
    

    2、注意

    1)一行的后面没有空格
    2)最后剩余0个也要输出

    3、代码

    #include<iostream>
    #include<math.h>
    using namespace std;
    int main() {
        int n;
        char c;
        int i, j,m,k;
        cin >> n >> c;
        //求解行数,小于总个数的目标数量
        //1,3,5,7...行数2m-1,总数2m^2-1,第一行2m-1个符号
        m = sqrt((n + 1) / 2);
    
        //倒三角
        for (j = m;j > 0;--j) {
            for (k = 0;k < m - j;++k) {
                cout << " ";
            }
            for (k = 0;k < 2 * j - 1;++k) {
                cout << c;
            }
            cout << endl;
        }
        //正三角
        for (j = 2;j <= m;++j) {
            for (k = 0;k < m - j;++k) {
                cout << " ";
            }
            for (k = 0;k < 2 * j - 1;++k) {
                cout << c;
            }
            cout << endl;
        }
        //输出剩余
        k = n - (2 * m*m - 1);
        cout << k;
        system("pause");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:【PAT-乙级-C++】1027. 打印沙漏(20)

          本文链接:https://www.haomeiwen.com/subject/wyrcaxtx.html