题目描述
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
-
先用 1,2,3... 的自然数拼一个足够长的串
-
用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是 8 时,如下图:
输入描述
输入一个正整数 n(3<n<300),表示三角形的高度。
输出描述
输出对应的三角形。
输入输出样例
输入;
5
输出:
....1
...2.1
..3...2
.4.....1
567891011
输入:
cpp
8
输出:
cpp
.......1
......2.1
.....3...8
....4.....1
...5.......7
..6.........1
.7...........6
891011121314151
注:考试原题中给了多组数据,但在蓝桥云课的题库里只提供了一组
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解法思路
- 看输出:由点和数字组成,并且每一行点的个数加数字的个数不一样,所以不能用二维数组存储。
- 关于点出现的位置:对于前面那块点:前n行都有,并且递减,直至为0。对于中间的点:除了第一行和最后一行,其余行都有,并且是 2*行数 - 3 个。
- 用string存储数字,因为到了10及以上要把个位和十位、百位(100及以上)拆开,用循环控制点的输出
- 对于输出数字,由于三角形左半边的数字是顺序输出,右半边的数字是逆序输出,所以设头尾指针来控制数字输出
- 通过找数学规律可发现:字符串里有效数字长度为4n-4(但字符串下标是从0开始的,所以尾指针设在4n-5),最后一行数字数量是2n-1
代码
cpp
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
for(int i = 1; i <= 300; i++)//将数字1到300存储到string里
{
s += to_string(i);//数字转字符->to_string()
}
int l = 0;//字符串头指针
int r = 4*n - 5;//字符串有效内容的尾指针
for(int i = 1; i <= n; i++) //n行
{
int temp = n-i;//三角形每行第一个数字前面有temp个点
while(temp > 0)//输出点
{
cout << ".";
temp--;
}
if(i == 1)//当在第一行时,只有一个数字,需特判
{
cout << s[l] <<endl;
l++;
}
else if(i == n)//当在最后一行时,全是数字,需特判
{
for(int j = 0; j < 2*n - 1; j++)//循环输出数字
{
cout << s[l];
l++;
}
}
else//除了第一行和最后一行外,剩下的行数都是两个数字
{
cout << s[l];//输出第一个数字
l++;
for(int j = 0; j < 2*i - 3; j++)//输出两个数字之间的点数
{
cout << ".";
}
cout << s[r] <<endl;//输出第二个数字并换行
r--;
}
}
return 0;
}