打印金字塔总结(c/c++)
前事不忘,后事之师;在做循环结构时惊觉前几题几乎都是打印space或*或字符、数字打印的图像,看了看没啥人做这种基础题的盘点总结,秉承节流(时间)的精神也就为类己的萌新规范化此类题目,亦当作后续牛客算法题解之预热
变尽人间、君山一点、自古如今
写到后面才觉应先写方法用诸后例:
1.明确画图要素:是单独的*、space加*还是space加其他符号如字母数字
2.明确需要几个for循环(咱常用for循环while循环的诸君勿怪):这点我在具体样例中会一一举出
3.猜测及验算行列与输入(n)之间关系(需要打多少个符号)
①.直角三角形/半金字塔
效果:
* ***
** 或 **
*** *
按解题思路,第一这是由单独组成的,当然其实还有endl或者/n;对于直角三角形/半金字塔这个图形只需要一层for(i)里嵌一层for(j)就足够;关系的话:左侧例子是每个j循环打印i个,总体循环n次;右侧为每个j循环打印n+1-i的*。
int main()//左例
{
int n;
while(cin>>n){//while这里的操作是为了起到类似函数能接纳多组测试输入;
//直接写函数可能导致占据空间超限
for(int i=1;i<=n;++i){//对于一个for循环,从1开始<=n时执行n次;从0开始<n是执行n次
for(int j=0;j<i;++j) cout << "*";
cout << endl;
}
}
}
int main()//右例
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
for(int j=0;j<n+1-i;++j) cout << "*";
cout << endl;
}
}
}
效果:
*** *
** 或 **
* ***
这里的例子与1的例子不同点仅在画图符号多了space,这使得第二步中所需要的for循环应该是:for(i)循环中嵌入for(j)–负责打印空格和for(k)–打印*。后续咱简称该模式为一个ijk循环。
int main()//左例
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
for(int j=0;j<i-1;++j) cout << " ";
for(int k=0;k<n+1-i;++k) cout << "*";
cout << endl;//对于咱规范化的一个ijk循环:
//i是总体循环次数也是行数
//j和k都为列,但循环次数分别为打印符号的个数
//习惯于i从1开始而jk都从0开始
//一个ijk循环的最后一句一定是打出换行
}
}
}
int main()//右例
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
for(int j=0;j<n-i;++j) cout << " ";
for(int k=0;k<i;++k) cout << "*";
cout << endl;
}
}
}
效果:
1 1
22 或 23
333 456
再一次变换的还是画图工具(变成了space加符号),这次的循环中需要加入的是一个索引index
int main()//左例
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
int index = i;
for(int j=0;j<i;++j) cout << index;
cout << endl;
}
}
}
int main()//右例
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
int index = 1;
for(int j=0;j<n-i;++j) cout << " ";
for(int k=0;k<i;++k) cout << index++;//一般来说数字金字塔不会是一半
//因为打印出来不是很对的上
//打印会考察printf加占位符的形式
//这里给出c形式的替换
//printf("%1d",index++)
cout << endl;
}
}
}
4. 原本这应该是字母金字塔,但它的索引跟输入(是字符型还是整型)有关,在后面给出具体题例
②正三角形/金字塔
效果:
*
* *
* * *
* * * *
* * * * *
想必经过上面半金字塔的学习这已经变得简单了吧,具体不同是画图工具变成了space和“* ”(*和一个空格),也就需要改变k循环里的执行语句
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
for(int j=0;j<n-i;++j) cout << " ";
for(int k=0;k<i;++k) cout << "* ";//这里这里
cout << endl;
}
}
}
- 这里给出一道牛客的题:字符金字塔
效果:
A
ABA
ABCBA
这题的输入输入一个一个大写字母,以下给出题解:
#include<bits/stdc++.h>
using namespace std;
int main(){
char n;
cin >> n;
int a = int(n)-int('A')+1;
for(int i=1;i<=a;++i){
for(int j=0;j<a-i;++j) cout << " ";
int A = int('A');
for(int k=0;k<i;++k) cout << char(A++);
A-=1;
for(int z=0;z<i-1;++z) cout << char(--A);
cout << endl;
}
}
3. 倒金字塔想来应该是无需阐述哩,权当思考题
③特殊图像
效果:
*
***
*
提示tips:上下双层的金字塔建议使用两个ijk循环(一个ijk,一个abc),若在同一个大循环中套四个小循环那么寻找相对关系时就会更复杂更难debug,以下是浅解:
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
for(int i=1;i<=n;++i){
for(int j=0;j<n-i;++j) cout << " ";
for(int k=0;k<2*i-1;++k) cout << "*";
cout << endl;
}//皮城
for(int a=1;a<n;++a){
for(int b=0;b<a;++b) cout << " ";
for(int c=0;c<2*(n-a)-1;++c) cout << "*";
cout << endl;
}//祖安
}
}
极其类似换汤不换药的还有:涂小天与他的画,在此同样给出拙见:
#include<iostream>
using namespace std;
int main(){
int T;
cin >> T;
int n;
while(cin>>n){
if(n==1) cout << "*" << endl;
else {
int p = (n+1)/2;//皮城
for(int i=1;i<=p;++i){
for(int j=0;j<p-i;++j) cout << " ";
for(int k=0;k<2*i-1;++k) cout << "*";
cout << endl;
}
int z = n-p;//祖安
for(int a=1;a<=z;++a){
for(int b=0;b<a;++b) cout << " ";
for(int c=0;c<2*(z-a)+1;++c) cout << "*";
cout << endl;
}
}
}
}
效果:
*
**
***
**
*
题解:
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
for(int i=1;i<=n+1;++i){
for(int j=0;j<2*(n+1-i);++j) cout << " ";
for(int k=0;k<i;++k) cout << "*";
cout << endl;
}//皮城
for(int a=1;a<n+1;++a){
for(int b=0;b<2*a;++b) cout << " ";
for(int c=0;c<(n+1-a);++c) cout << "*";
cout << endl;
}//祖安
}
}
- 镂空金字塔
效果:
*
* *
* *
* *
* * * * *
主代码:
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < n - i; ++j) cout << " ";
for (int k = 0; k < i; ++k) {
if (k==0 || k==i-1 || i==n) cout << "* ";//在k循环中加入判断条件达到镂空效果
else cout << " ";}
cout << endl;
}
}
- 实心沙漏
效果:
* * * * *
* * * *
* * *
* *
*
* *
* * *
* * * *
* * * * *
主代码:
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < i - 1; ++j) cout << " ";
for (int k = 0; k < n + 1 - i; ++k) cout << "* ";
cout << endl;
}//皮城
for (int a = 1; a < n; ++a) {
for (int b = 0; b<n-1-a;++b) cout << " ";
for (int c = 0; c<a+1;++c) cout << "* ";
cout << endl;
}//祖安
}