杨辉三角,是二项式系数在三角形中的一种几何排列。它的规律是这样子的:
前提:每行端点与结尾的数为1.
-
每个数等于它上方两数之和。
-
每行数字左右对称,由1开始逐渐变大。
-
第n行的数字有n项。
-
前n行共[(1+n)n]/2 个数。
-
第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
-
第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一。
-
每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。
-
(a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。
下图展示了杨辉三角前7行:
解法1:
用二维数组实现杨辉三角前10行
#include <stdio.h>
void YangHui_Triangle()
{
int arr[10][10] = {};
for (int i = 0; i < 10; i++)
{
for (int k = 30 - 2 * i; k > 0; k--) //打印空格
{
printf(" ");
}
for (int j = 0; j < i; j++)
{
if (j != 0 && j != i)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
else
{
arr[i][j] = 1;
}
printf("%3d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
YangHui_Triangle();
return 0;
}
结果如下:
解法2:
用一位数组实现杨辉三角前10行
void YangHui_Triangle2() //一维数组实现方法
{
int arr[12] = { 1 };
int brr[12] = { 1 };
for (int i = 0; i < 10; i++)
{
for (int k = 30 - 2 * i; k > 0; k--) //打印空格
{
printf(" ");
}
for (int j = 0; j <= i; j++)
{
if (j - 1 >= 0)
{
arr[j] = brr[j - 1] + brr[j];
}
}
for (int k = 0; k <= i; k++)
{
brr[k] = arr[k];
printf("%4d", arr[k]);
}
printf("\n");
}
}
int main()
{
YangHui_Triangle2();
return 0;
结果示例:
解法3:
不使用数组,只使用循环来实现杨辉三角
由于如果不能使用数组,每行的值要直接输出,没发借助上一行的值来辅助输出,因此寻找了一个新的规律如下:
第n行的第一个数为1,第二个数为1*(n-1),第三个数为 1*(n-1)*(n-2)/2,第四个数为1*(n-1)*(n-2)/2*(n-3)/3......以此类推.....
C 语言代码如下:
void YangHui_Triangle3()
{
int a = 1;
int tmp = 1;
for (int i = 0; i < 10; i++)//确定行数
{
for (int k = 30 - 2 * i; k > 0; k--) //打印空格
{
printf(" ");
}
for (int j = 0; j <= i; j++)
{
if (j == 0)
{
printf("%3d ", 1);
}
/*else if (j == i)
{
printf("%3d", 1);
}
*/
else
{
tmp = tmp * ((i + 1) - j) / j;
printf("%3d ", tmp);
}
}
tmp = 1;
printf("\n");
}
}
int main()
{
YangHui_Triangle3();
return 0;
}
结果示例: