详解:来自算法笔记
简化版:上下三角形(整体布局)–>三角形按行输出–>每行由空格和字符数部分组成—>计算 字符数最大值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.对称打印若为空格,可以只打印一边,另一边刚好用换行替代了