1027 打印沙漏

在这里插入图片描述

详解:来自算法笔记
在这里插入图片描述
简化版:上下三角形(整体布局)–>三角形按行输出–>每行由空格和字符数部分组成—>计算 字符数最大值x(底部)和每行字符之前的空格数(x-当前非空格数)/2,字符之后的空格直接用换行代替

AC代码

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
    int n;
    char c;
    cin >> n >> c;
    int buttom = (int)sqrt(2.0 * (1 + n)) - 1;  //三角形底边字符数
    if (buttom % 2 == 0) buttom -= 1;  //若为偶数要减一变为奇数(题目要求)
    int used = (1 + buttom) * (1 + buttom) / 2 - 1;  //总字符数

    //上三角形
    for (int i = buttom; i >= 1; i-=2) {  //i为当前行字符数
        //空格
        for (int j = 0; j < (buttom - i) / 2; j++) {  //(buttom - i) / 2为当前行字符前的空格数
            cout << " ";
        }
        //字符
        for (int j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
    }

    //下三角形
    for (int i = 3; i <= buttom; i += 2) {  //i为当前行字符数
       //空格
        for (int j = 0; j < (buttom - i) / 2; j++) {  //(buttom - i) / 2为当前行字符前的空格数
            cout << " ";
        }
        //字符
        for (int j = 0; j < i; j++) {
            cout << c;
        }
        cout << endl;
    }
    cout << n - used;
    //system("pause");
    return 0;
}

总结
1.打印图形就是找规律,要多去刷题来锻炼分析问题的能力,怎么由大问题拆解成小问题的
2.对称打印若为空格,可以只打印一边,另一边刚好用换行替代了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值