【洛谷P5725】深基4.习8 求三角形
题目描述:
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
例如:
输入4
输出
01020304
05060708
09101112
13141516
01
0203
040506
07080910
题目分析:
这一类题目对for循环的掌握程度要求较高,小编也是苦思冥想了很久。现在把小编的思路分享给大家吧!
首先,我们想几个问题:
- 题目输出的010203这些是如何实现的?
- 正方形的行数和列数怎么控制?
- 如何让数字一直往后加?
- 怎么控制空格的输出?
做这类题目,要先看结果,通过结果提出问题,解决所提出的问题这类题目就迎刃而解了。下面,我们先看第一个问题,如何实现010203?
不难看出,这些数字都是个位数,也就是小于10的数,用判断即可解决。加上字符0作为前导即可。代码如下:
if(n<10)
cout<<"0"<<n;
好,解决了第一个问题,接下来就看第二个问题。如何控制行数和列数?这里我们需要将一个知识点——循环的嵌套。
在一个循环体内包含另一个完整的循环结构,我们叫做循环的嵌套。从内嵌的循环中,还可以嵌套循环,这就构成的多重循环。一般来说,循环越多程序越复杂,代码难以理解。
对于外层循环来说,每执行一次,内层循环就执行整个循环过程。通俗点说,就是外循环执行一次,内循环遍历一次。
在这个题目中,对于行数和列数的控制我们就使用二重for循环,外层循环控制行数,内层循环控制列数。题例所给的输入值是4,也就是有一个4行的正方形,列数是用数字来控制,也就是每一行都存放4个数。代码如下:
for(i=1;i<=n;i++) //控制行数
{
for(j=1;j<=n;j++) //控制列数
{
static int k=1; //保证数字每次执行结束后不会归为1
if(k<10)
cout<<"0";
cout<<k;
k++;
}
cout<<endl;
}
针对于第三个问题,在上述代码中已经解决了,只需要定义一个静态(static)变量即可。静态变量其程序执行结束后,不会释放变量存储空间,还会接着最后一次的值执行。
现在先看第一部分的程序执行结果吧!
是不是已经出现了和题例一样的正方形矩阵了,这说明我们的程序没有问题。接下来,就是本题最难的地方了——输出右对齐三角形。
如果我们输出左对齐三角形,那很容易
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
static int k=1;
if(k<10)
cout<<"0";
cout<<k;
k++;
}
cout<<endl;
}
这样就输出了左对齐三角形,但是右对齐怎么输出呢?虽然说仅仅只是一个相反的,但是我们需要考虑的是空格的输出。这也就是我们的第四个问题。
通过题例,我们可以发现,第一行是有6个空格,第二行4个空格,第三行2个空格,最后一行没有空格。我们假设一个变量n作为行数,不难看出每一行所占的字符个数都是2n个。所以当n=4时,第一行空格2n-2,第二行空格2n-4,第三行空格2n-6,第四行空格2n-8。
我们知道,当i=1时,也就是第一行的空格数最多为6个,就是2n-2,那这个2又是怎么来的呢,在编程中我们可以写成2*(n-i),当i=1,n=4时,2*(n-i)=6就是第一行的空格,i值累加,外层循环决定行数,内层循环决定列数。代码如下:
for(i=1;i<=n;i++)
{
for(sp=1;sp<=2*(n-i);sp++) //sp表示空格
{
cout<<" ";
}
for(j=1;j<=i;j++)
{
static int k=1;
if(k<10)
cout<<"0";
cout<<k;
k++;
}
cout<<endl;
}
输出空格是这一题最难的,尤其是2*(n-i)这个公式很难推出来,小编也是想了好久。感兴趣的小伙伴们可以自行通过结果推出这个公式,会受启发!下面,我们一起来看看效果如何吧!
运行结果如下:
很显然,已经达到了题目的要求,证明我们的思路没有错。本题的题解就到此结束,主要是一个嵌套循环的使用和一个输出空格的方法,这两个在C/C++语言中很常见。和这一题类似的题目在这里(点我就行),有兴趣的读者可以自行尝试。
结语
由于编者的水平有限,若有广大网友有更好的代码,欢迎私信!不足之处欢迎批评指正!