#include<stdio.h>
void print1(int arr[10][10])
{
int i = 0; int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
{
printf("%4d", arr[i][j]);
}
//内部的第一个循环j<=i就框定了有效元素的范围
//通过遍历对数组内的有效元素进行输出
printf("\n");
}
}
void print2(int arr[10][10])
{
int i = 0; int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 9 - i; j++)
{
if (i == 9)
break;
//这条if语句是为了让整体更加好看而增加的
//读者可自行删去观察效果(三角形整体会向右移动一些)
printf(" ");
}
for (j = 0; j < i+1; j++)
{
printf("%5d ",arr[i][j]);
}
printf("\n");//换行输出
}
}
//函数起点:
int main()
{
int arr[10][10] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
{
if (i == j)
{
arr[i][j] = 1;
}
else if (j == 0)
{
arr[i][j] = 1;
}
else if (i >= 2 && j >= 1)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
print1(arr);//正常输出
print2(arr);//三角输出
return 0;
}
本文的杨辉三角为便于理解,以固定行数,共十行。
杨辉三角规律: 如图所示,杨辉三角始于顶端的一个数字1,所有空白的区域均可视为0。下一行的每个元素都由其上一行的元素所组成。
这是一个斜三角,所以他的元素组成为它正上面的一个元素和第一个元素左边的元素相加所构成的。
如果这是一个标准的杨辉正三角,其元素构成应该为其上一行的正对的左右两个元素相加。
可以通过下面的最终的打印结果进行辅助理解。
杨辉正三角:
理论斜三角:
杨辉三角的实现:
准备一个长和宽均为十的二维数组进行数据存放。
1.外部的实现:
观察数组不难发现在列数为0时,在行数列数相等时,数组内存放元素为1;
由于是对二维数组进行赋值,因此先使用两个嵌套for循环。
在列数j==0时,利用if分支函数进行赋值;同理在列数行数相等时(i==j),利用分支语句进行赋值操作。
2.内部的实现:
由上可知杨辉三角的工作原理,因此也可以很好的写出内部每个元素的大小。由于是内部的赋值,我们首先需要利用if判断语句剔除尾部的数字,避免无意义的计算。
由此易得判断条件为:(i >= 2 && j >= 1),所求元素的表达式为:arr[i][j] = arr[i - 1][j]+arr[i - 1][j - 1]
经过内外部的共同计算,整个杨辉三角已经呈现在了我们眼前,接下来的问题便是输出杨辉三角:
杨辉三角的输出:
本文介绍两种函数进行输出,在代码区域已经用print1与print2封装完成。
无论我们以什么样的方式进行输出,都要注意一个问题:
就是我们在在初始化数组过程中的一些无效元素(初始化所确立的值),这些元素是我们不需要的,因此在输出过程中要通过对循环条件的控制去除其对整体输出效果的影响。
有效与无效相混杂的效果:
杨辉三角的 斜三角 形式输出(print1函数):
这是一种较为简单的输出方式,其基本思路就是对二维数组的简单遍历,再使用printf函数进行打印的过程。
对于内层循环,是打印每一行具体元素的关键循环,因此我们更改其限制条件j<=i,便可以有效的清除右半部分的斜三角了。
杨辉三角的 正三角 形式输出(print2函数):
根据观察,不难发现这是一个简单的正三角形。根据我们对菱形的知识,我们可以联想到这是一个菱形的上半部分。
笔者在前面曾介绍过菱形的打印方式:打印菱形的分析_approachin'的博客-CSDN博客https://blog.csdn.net/weixin_63192658/article/details/122682557
但相对于文中所介绍的菱形打印方式,这里的杨辉三角看起来更加困难,但我们不妨以整体的思想解决这一输出方式:
我们把菱形中的每一个“*”改为“元素数据+空格”的形式后再进行输出,就可以得到最终我们想要得到的形式了。