题目:等腰三角形
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
- 先用1,2,3,…的自然数拼一个足够长的串
- 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用"."代替。
例如:
输入:
5
程序应该输出:
再例如:
输入:
10
程序应该输出:
再例如:
输入:
15
程序应该输出:
思路:
首先最重要的一步就是找到需填数字位置的规律,由输出模拟可以看出假设输入的数字为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=0,s=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';