第九屆藍橋杯省賽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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章