思路很简单
1:用字符串保存下自然数
2:找规律,把等腰三角形分成三部分循环,这样使得编号简单。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <sstream>
using namespace std;
const int N = 620;
int n;
char f[N][N];
int s[10010];
int main(){
cin >> n;//n排
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n+i-1;j++){
f[i][j] = '.';
}
}
int m = 1;
for(int i = 1;i < 600;i++){//处理600个数字,一定可以包含全部的
int t = i;
if(t < 10){//小于10直接保存
s[m++] = t;
}
else{//保证每一位存一个数字
char tn[4];
int mod = 0,k = 0;
while(t != 0){
mod = t % 10;
t /= 10;
tn[k++] = mod;
}
for(int x = k-1;x >= 0;x--){
s[m++] = tn[x];
}
}
}
//此时自然数串已经拼接好
//根据规律向f中加数字,先将数字转换成字符串形
string sn = "";
for(int i = 1;i < m;i++){
sn += (s[i]+'0');
}
//三条边分成左,下,右三部分编号更简单
int t = 0;
//左
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n+i-1;j++){
if(j == n-(i-1)){
f[i][j] = sn[t++];
}
}
}
//下
for(int i = 2;i <= n+n-1;i++){//从2开始,不然会被覆盖
f[n][i] = sn[t++];
}
//右
for(int i = n-1;i > 1;i--){
f[i][n+i-1] = sn[t++];
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n+i-1;j++){
cout << f[i][j];
}
cout << endl;
}
return 0;
}