第八题:等腰三角形
题目描述
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
- 先用1,2,3,…的自然数拼一个足够长的串
- 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
显示不正确时,参看:p1.png
输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用"."代替。
例如:
输入:
5
程序应该输出:
....1
...2 1
..3 2
.4 1
567891011
再例如:
输入:
10
程序应该输出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
再例如:
输入:
15
程序应该输出:
..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
题目分析在代码注释中。
#include <bits/stdc++.h>
using namespace std;
int n,a[1000][1000];//把图形当成二维数组来做。
int b[1500];
int len,num;
int getnum() //先把你可能要用到的数字放到数组b中
{
int j=0,i;
for (i=1;i<1000;i++)
{
num=i;
if(num<=9) //一位数
{
b[j]=num%10+1;
j++;
}
else if(num>=10&&num<=99)//两位数
{
b[j]=num/10+1;
j++;
b[j]=num%10+1;
j++;
}
else { //三位数
b[j]=num/100+1;
j++;
b[j]=num%100/10+1;
j++;
b[j]=num%10+1;
j++;
}
}//每个数字都占一位
return 0;
}
int main()
{
getnum();
scanf("%d",&n);
int i,j,index=0;
len=2*n-1;//这是指的是最下层的数字长度
for(j=n-1,i=0;j>=0;j--,i++) //左边的一排数字
{
a[i][j]=b[index];
index++;
}
for(j=1,i--;j<len;j++)//最下面一排数字
{
a[i][j]=b[index];
index++;
}
j--;
for(i--,j--;i>=1;i--,j--)//右边的一排数字
{
a[i][j]=b[index];
index++;
}
for(int x=0;x<n;x++)
{
for(int y=0;y<n+x;y++)
{
if(a[x][y]==0)
printf(".");
else printf("%d",a[x][y]-1);
}
printf("\n");
}
return 0;
}