在算法题中经常会碰到需要画金字塔的题, 在这里简单记录一下.
一般情况下, 金字塔需要两层循环, 外层循环代表行数, 内层循环则用来输出. 我们先来观察一下这个金字塔.
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
可以看到行数为 5, 每一行的输出个数等于行数, 且每输出一个数都会空一格. 那么可以根据这个规律编写一个算法
#include <iostream>
using namespace std;
int main(void)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
cout << 1 << ' ';
cout << endl;
}
return 0;
}
输出结果
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
如果想当然的去直接写结果肯定是错的. 我们先观察一下如何输出第一行的 1. 可以看出当内循环的次数等于达到最大循环次数 + 1 时输出 1
#include <iostream>
using namespace std;
int main(void)
{
for (int i = 0; i < 5; i++)
{
if (5 == i + 1)
cout << 1 << ' ';
else
cout << ' ';
}
return 0;
}
而且我们继续观察会发现, 从第二行开始每一行输出第一个数的位置都要在前一行输出第一个数的位置上 - 1, 因此我们就可以得到画金字塔的算法了
#include <iostream>
using namespace std;
int main(void)
{
int temp = 5;
for (int j = 0; j < 5; j++)
{
for (int i = 0; i < 5; i++)
{
if (i + 1 >= temp) /*不止一个数, 因此要 >= */
cout << 1 << ' ';
else
cout << ' ';
}
cout << endl;
temp--;
}
return 0;
}
输出结果
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
下面再更新一个
#include <iostream>
#include <array>
using namespace std;
int main(void)
{
array<int, 100> A;
int m = 5;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m - i - 1; j++)
cout << ' ';
for (int k = 0; k <= i; k++)
cout << 1 << ' ';
cout << endl;
}
return 0;
}