PAT乙级1027

题目链接

https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328

题解

主要有两个内容:

  1. 获取第一行(最长行)字符的个数。这个与一般的菱形打印不同,该题的字符不一定用完。
  2. 通过循环输出空格与字符(末尾空格就不用输出了)
// PAT BasicLevel 1027
// https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328

#include <iostream>
using namespace std;

int getLineMaxCount(int maxNum);
int main()
{
    // 字符可用数量及字符
    int n;char c;
    cin >> n >> c;

    // 获取第一行字符的个数
    int maxNum = getLineMaxCount(n);

    // 已输出字符个数
    int count=0;

    // 当前行输出字符个数
    int num = maxNum;

    // 输出上半部分
    while(num>1){
        // 输出空格
        for(int i=0;i<(maxNum-num)/2;++i){
            cout << ' ';
        }

        // 输出字符
        count+=num;
        for(int i=0;i<num;++i){
            cout << c;
        }

        // 换行
        cout << endl;
        num-=2;
    }

    while(num<=maxNum){
        // 输出空格
        for (int i = 0; i < (maxNum - num) / 2; ++i){
            cout << ' ';
        }

        // 输出字符
        count+=num;
        for (int i = 0; i < num; ++i){
            cout << c;
        }

        // 换行
        cout << endl;
        num += 2;
    }

    // 输出剩余字符个数
    cout << n-count;

    //system("pause");
    return 0;
}

// 根据字符可用数量获取第一行字符个数
int getLineMaxCount(int maxNum)
{
    int sum=-1,count=1;
    while (sum + count * 2 <= maxNum){
        sum += count * 2;
        count += 2;
    }

    return count-2;
}

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


原文地址:https://www.cnblogs.com/chouxianyu/p/11318423.html