第九届蓝桥杯 c组c/c++ 省赛 第八题---等腰三角形题解(步骤详讲)

题目:等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

  1. 先用1,2,3,…的自然数拼一个足够长的串
  2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
    比如,当三角形高度是8时:


输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用"."代替。

例如:
输入:
5

程序应该输出:
....1...2.1..3...2.4.....1567891011
再例如:
输入:
10

程序应该输出:
........1........2.2.......3...2......4.....2.....5.......1....6.........2...7...........0..8.............2.9...............91011121314151617181
再例如:
输入:
15

程序应该输出:
..............1.............2.3............3...2...........4.....3..........5.......1.........6.........3........7...........0.......8.............3......9...............9.....1.................2....0...................8...1.....................2..1.......................7.1.........................221314151617181920212223242526

思路:

首先最重要的一步就是找到需填数字位置的规律,由输出模拟可以看出假设输入的数字为n,
那么先填左边一列数字和全部的 (.),需填入数字规律为p=n-1随后每行减1边界为r=n,随后每行+1

for (int i = 0; i < n - 1; i++)
{
   
	for (int j = 0; j < r; j++)
	{
   
	xxxxxxxxxxxxxx
	}
	p--;
	r++;
}

然后就是最下面那一条边了,也是最简单的一条边单层for循环即可arr[n-1][j] 只用改变j的值
最后轮到右边呢一条的填入,也是单层循环,注意是要从底部向上填也就是i从n-2到1,这里的r就是行
至于为什么不是双层循环因为我们先前已经把所有的 (.) 填入过了,只用填一列数字相当于一维数组的遍历

	for (int i = n - 2; i > 0; i--)
	{
   
	r--;
	}

相信大家最关心的问题不是如何填入,而是怎么拆分数字吧,比如到了15必须要先填一个1下一个位置再填5这种令人烦恼的问题,我对此是这样做的:
首先就是订三个变量了,分别表示百位,十位,个位,当个位加到10时则清零并对十位加1,百位同理,
当十位不为0时则s=1,会进入第二个if分支(填入十位),退出分支时s=0s=0则下一次会进入第三个if分支(填入个位)
百位同理:while(百位(q)–>>十位(w)–>>个位(count))

int s = 0; //条件控制
//这里我们不用拆分,拆分太复杂,虽然这个也不是很方便
int q = 0, w = 0, count = 1; //q为百位,w为十位,count为个位,依靠s来控制填入

/***************************下面的代码在循环内****************************/
if (s == 2) //填入百位
{
   
	s = 1;
	arr[i][j] = q + '0';
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值