題目要求:
本題目要求你在控制檯輸出一個由數字組成的等腰三角形。
具體的步驟是:
先用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;
}