题目要求:
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
先用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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
思路:先利用stringstream构建数字字符串(sprintf也行)。然后我们发现高为n的话,一共有n行,最后一行有2n-1个字符,那么一共就有2n-1+n-1+n-2=4n-4个字符。除了第一行与最后一行,其余每行都只有两个字符,所以我们分开处理,对2到n-1行,每行应该输出字符的位置为n-i+1和2n-(n-i+1),行数1开始,每行的位置坐标也从1开始。左边字符第几行就输出几,即str[i-1],右边输出str[4n-4-(i-1)](左右之和为字符串长度)。最后一行的字符为str[n-1]到str[3n-1]。(我的字符串从0开始)。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string str;
stringstream ss;
int main() {
int n;
cin>>n;
int x=2*n-1;
for(int i=1;i<=1500;i++) { //先产生1到1500的字符串
string str1;
ss<<i;
ss>>str1;
str+=str1;
ss.clear();
}
int length=4*n-4; //等腰三角形周长
for(int i=1;i<=n;i++) { //一共n行
if(i!=n&&i!=1) { //除了这两行其余每行都只有两个数
for(int j=1;j<=n+i-1;j++) {
if(j==n-i+1) { //每一行左边的那个数
cout<<str[i-1];
}else if(j==2*n-(n-i+1)) { //左右下标之和为2*n
cout<<str[4*n-4-(i-1)]<<endl; //每一行右边的数 ,每一行左边和右边的数应该输出的序号之和为4*n-4
}else {
cout<<'.';
}
}
}else if(i==1) {
for(int x=1;x<=n;x++) { //处理最后一行,最后一行有2*n-1个字符
if(x==n) {
cout<<'1'<<endl;
}else {
cout<<'.';
}
}
}else {
for(int m=1;m<=2*n-1;m++) { //处理最后一行,最后一行有2*n-1个字符,从str[n-1]到str[3*n-1]
cout<<str[n+(m-2)];
}
}
}
return 0;
}