题目描述
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
输入格式
输入矩阵的规模,不超过 9。
输出格式
输出矩形和正方形
输入输出样例
输入 #1复制
4
输出 #1复制
01020304 05060708 09101112 13141516 01 0203 040506 07080910
解题思路
矩形不必多说,设定n行n列,再设定一个数从1开始,只要这个数小于10就补前导0输出即可
int n;
cin >> n;
int tmp = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (tmp < 10) cout << 0;
cout << tmp;
tmp++;
}
cout << endl;
}
cout << endl;
重点看第二个,要求三角形,也是设定一个数num从1开始,不足10就补前导0,这时候就要观察规律了。
观察得到以下结论:
1.对于给出的数n,一共存在n行,2n列
2.从第一行开始,存在非空格数依次是 2, 4, 6, 8,……。 将他们和行数一起关联,可以发现第i行,非空格数是 2i 个
3.每一行有2n列,那么每一行的空格数就是 2n - 2i个
那么我们可以得到以下核心代码
//4行最多4*8格,n行,2*n列
//2 4 6 8 10 每行增加2格
//第i行,有2*i个数,有2*n - 2*i个空格
//i从一算起
int num = 1;
for (int i = 1; i <= n; i++) //第i行
{
int space = 2*n - 2*i;
int flag = 0; //标记小于10的数输出0后是否输出这个数
for (int j = 1; j <= 2*n; j++) //第j列,有2n个数,每列只会输出一个数
{
if (flag == 1) {
flag = 0;
continue;
}
if (space == 0 && num < 10 ) { //判断space为0要放在前面
cout << "0" << num;
flag = 1;
num++;
}
else if (space == 0 ) {
cout << num;
flag = 1;
num++;
}
if (space != 0) //每一列做判断
{
cout << " "; //输出一个空格
space--;
}
}
cout << endl;
}
这里我让j从1到2n, 对齐n有n行2n列,
当输出非空格时,实际上我们输出了占据两个空格的数,这时候就需要让下一个位置直接跳过不做任何操作