假设杨辉三角的通项公式为a(n),则打印形式如下:
然而我们知道,它应该是这样的:
三角形两边的值都为1,且每个元素的值都为该元素正上方和其正上方前面的元素的值之和。
为了实现这个代码,我们需要知道每行首元素和每行最后一个元素的下标随着行的变化而对应的函数表示。我们很容易得到:
然后利用定义,也即: 每个元素的值都为该元素正上方和其正上方前面的元素的值之和。
易得:
很自然的,我们实现了关于杨辉三角的打印的相关代码。 以下是代码,具体信息已经写在注释里了。
#include <stdio.h>//b函数返回的是第n行第一个元素的下标
int b(int n)
{return (n * n - n + 2) / 2;
}//c函数返回的是第n行最后一给元素的下标
int c(int n)
{return (n * n + n) / 2;
}int main()
{int n;int a[10000] = {0};int row = 1;printf("请输入要打印的行数:>");scanf("%d", &n);int i = 1;//打印行while (row <= n){//将每行的两边的元素都置为1a[b(row)] = 1;a[c(row)] = 1;//打印列for (int j = 0; j < row; j++){if (c(row) - b(row) > 1){//只要每一行的首尾之间还有元素则进去for (int i = 1; b(row) + i < c(row);i++){//利用杨辉三角的定义,为每个元素计算出值a[b(row) + i] = a[b(row - 1) + (i - 1)] + a[b(row - 1) + i];}}printf("%-4d ",a[i]);i++;}row++;printf("\n");}
}
程序的运行: