杨辉三角的特点:
形状如下:
从上图可以看出:
(1)最外两侧的元素都是1;
(3)第一行有1个元素,第二行有2个元素,第三行有3个元素……(可以用两个元素来遍历)
(2)除最外侧元素外,其他元素都是 上一行 的 上一列元素 加 同一列元素 的 和,
如3=1+2,4=3+1,10=4+6
代码实现
(1)二维数组
更容易理解,占用内存相较一维数组较大
#include<stdio.h>
int main()
{
int n, i, j;
printf("输入要输出的行数:");
scanf("%d", &n);//输入行数
int arr[100][100] = {0};//定义二维数组,用于存储
for (i = 0; i < n; i++)//遍历每一行
{
for (j = 0; j < n-i; j++)
{
printf(" ");//打印空格
}
for (j = 0; j <= i; j++)//每一行的数字
{
if (j == 0 || j == i)
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//每个数是上面两个数之和
}
printf("%6d", arr[i][j]);//两个数之间的距离
}
printf("\n");
}
return 0;
}
(2)一维数组
#include<stido.h>
int main()
{
int n, i, j;
printf("输入要输出的行数:");
scanf("%d", &n);
int arr[100] = { 0 };//定义数组
arr[0] = 1;//初始化第一个元素
for (i = 0; i < n; i++)//遍历每一行
{
for (j = 0; j < n - i; j++)
{
printf(" ");//打印空格
}
for (j = i; j >=0; j--)//从后向前遍历,不是从前向后遍历
{
if (j == 0 || j == i)
{
arr[j] = 1;//边界
}
else
{
arr[j] = arr[j - 1] + arr[j];//计算当前数字
}
printf("%6d", arr[j]);//打印当前数字
}
printf("\n");//换行
}
return 0;
}
(3)递归实现
#include<stdio.h>
int get_trl(int i, int j)
{
if (j == 0 || j == i)
{
//判断边界,如果是边界就返回1
return 1;
}
else
{
//用递归计算
return get_trl(i - 1, j - 1) + get_trl(i - 1, j);
}
}
int main()
{
int n, i, j;
printf("输入要输出的行数:");
scanf("%d", &n);
for (i = 0; i < n; i++)//遍历每一行
{
for (j = 0; j < n - i; j++)
{
printf(" ");//打印空格
}
for (j = 0; j <=i; j++)//每行的数字
{
printf("%6d", get_trl(i,j));//
}
printf("\n");//换行
}
return 0;
}
运行结果均如下图
关于上述代码中不易理解的点
一维数组
即当从前向后遍历时会出现错误,是因为 arr[ j-1 ] 与 arr[ j ] 和我们预想中对应的数值不一样
如图,此时为 j=1 ,arr[ j ] = arr[1]=3, arr[ j-1] = arr[0]=1,
那么当 j=2 ,arr[ j ]=arr[2] = arr[1]+arr[0] =4
从后向前遍历即可避免这个错误