第九届蓝桥杯省赛C组第八题-------等腰三角形

题目要求:

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

先用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;
}

原创文章 19 获赞 76 访问量 7206

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/105947244
今日推荐