【深基4.习8】求三角形
题目描述
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
输入格式
输入矩阵的规模,不超过 9 。
输出格式
输出矩形和正方形
样例 #1
样例输入 #1
4
样例输出 #1
01020304
05060708
09101112
13141516
01
0203
040506
07080910
题目解析
题目大意:
- 题目要求输入一个不大于9的自然数,程序输出一个4×4的矩阵(每个数占两位依次排列)和一个底4高4的下三角形(每个数占两位依次排列),两图形间含一空行。
题目分析:
-
设输入的数为n,因n<9,故所有数均不会超过两位,问题的处理难度降低。
-
观察两个图形,矩形中每行四个数字,每个数字占两位;三角形中每行依次增加一个数字,且第k行前有2*(n-k)个空格。
-
对于矩形来说,输出1~n2共n2个数,对于三角形来说输出sum(1+2+···+n)个数,我们可以不考虑到底输出到了多少,只需要按照规则输出即可。
-
解决思路:可以使每个数字格式化输出两位数;对于矩形,当满足四个时输出一次回车;对于三角形,
- 思路1:每行输出2 * (n-k)个空格后输出一个格式化后的数,输出范围是1~2 *(n+1) ;
- 思路2:把每行当做一个要处理的整体,定义一个count计数器,按照规律输出并自增1 。对于这个下三角形,观察其特点:每行四个整体,为两个空格或一个两位数,那么便有:第一行有前三个是两个空格,最后一位是两位格式化的count。
代码题解
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;//输入行数
if(n>5||n<0)//异常处理
{
return 0;
}
else
{
for(int i=1;i<n*n+1;i++)//从1到n^2输出
{
cout<<setfill('0')<<setw(2)<<i;
if(i%n==0)//每n个数换一次行
{
cout<<endl;
}
}
cout<<endl;
int count=1;//三角形上每位要依次输出的数字
for(int j=0;j<n;j++)//在共n行中
{
for(int k=0;k<n;k++)//在每行的n个数中
{
if(k<(n-j-1))//如果是下三角形之外的部分(比如第三行有一个部分是空格部分,三个部分是数字,则就有4-2-1=1个空格部分,且每个部分内是两个空格
{
cout<<" ";
}
else
{
cout<<setfill('0')<<setw(2)<<count;//输出在本位置的数字
count++;
}
}
cout<<endl;
}
}
return 0;
}
解法2:
#include <iostream>
using namespace std;
int main()
{
int n,x=1;
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (x < 10)//当x不足两位数时用0补足
{
cout << "0";
cout << x;
x++;
}
else
{
cout << x;
x++;
}
}
cout << endl;
}
cout << endl;
x = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < (n - i - 1) * 2; ++j, cout << " ");//控制每行数字输出前面的空格数量的。在斜向上的数字三角形中,每一行数字输出之前都会有一定数量的空格,而这些空格的数量是逐渐减少的(每行减少2个)。
for (int k = 0; k < (i + 1); ++k, ++x, printf("%02d", x));//来输出斜向上的数字三角形中的数字的。在斜向上的数字三角形中,每一行数字的数量是逐渐增加的(每行增加1个)。这个循环控制每行输出的数字数量,并且利用printf("%02d", x)来格式化输出数字,确保输出的数字始终占据两位位置,不足两位时在前面补零。++x用于将要输出的数字递增。
cout << endl;
}
return 0;
}