【洛谷P5725】求三角形

【洛谷P5725】深基4.习8 求三角形

题目描述:
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
例如:
输入4
输出
01020304
05060708
09101112
13141516

      01
    0203
  040506
07080910

题目分析:
这一类题目对for循环的掌握程度要求较高,小编也是苦思冥想了很久。现在把小编的思路分享给大家吧!

首先,我们想几个问题:

  1. 题目输出的010203这些是如何实现的?
  2. 正方形的行数和列数怎么控制?
  3. 如何让数字一直往后加?
  4. 怎么控制空格的输出?

做这类题目,要先看结果,通过结果提出问题,解决所提出的问题这类题目就迎刃而解了。下面,我们先看第一个问题,如何实现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++语言中很常见。和这一题类似的题目在这里(点我就行),有兴趣的读者可以自行尝试。

结语
由于编者的水平有限,若有广大网友有更好的代码,欢迎私信!不足之处欢迎批评指正!

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值