*以下内容包含了详细注解,便于食用。 *
#include<iostream> #include<stdlib.h> using namespace std; int main(){ int i,j; //循环变量 int n,sum; //接收行数 和 行数对应的数据个数 int *p; //数组 cin>>n; sum=n* (1+n) / 2; //计算n行对应的数据个数 p=(int *)malloc(sizeof(int)*(sum+1)); //放弃P[0],从P[1]开始存储数 /* 首先把 杨辉三角两边的 1 全部赋值完成 左边部分的1:对应在数组中的下标位置为:1 2 4 7 11 ... ,可以观察到其间隔分别为 1 2 3 4.... 所以可以将其转换为数学公式(从1开始,每次加上间隔数,就是当前的位置)即: 1 + ( (1-1) + i )* (i-1) //注意理解第i行 共有 i-1 项 间隔数 右边部分的1:由观察可知 它是左边部分的1 对应的坐标减一得到,所以可以写为:1 + ( (1-1) + i )* (i-1) 但是,要考虑到最后一项并不在这个公式里面,所以需要单独表示:p[sum] = 1; */ for( i = 2 ; i <= n ; i++ ){ //这里的i表示行数 p[ i*(i-1)/2 ] = 1; p[ 1 + i*(i-1)/2 ] = 1; } p[sum]=1; //上述循环代码缺少最后一个数据,所以要补上 /* 把杨辉三角的内部补全: 由观察可知,杨辉三角内部的数字都是其头上的两个数字之和 ,并且观察其行列数,可发现: 第i行j列的数字(i>=3,1<j<i)= 第i-1行j-1列的数据 + 第i-1行第j列的数据 (因为 第i行对应的数据个数最多就是 i个,而第i个为每行的最后一个,所以一定为1,则 j 应该 < i ) 最后因为:第i行j列的数据对应数组的下标位置应该是 前 i-1 行数据的总和 加上 j 即可完成以下代码 */ for ( i = 3; i <= n; i++) for ( j = 2; j < i; j++) { p[(i-1)*(i+1-1)/2+j] = p[(i-2)*(1+i-2)/2+(j-1)] + p[(i-2)*(1+i-2)/2+j] ; } /* 输出数据 */ sum=1; for(i=1;i<=n;i++){ for(j=0;j<i;j++) printf("%d ",p[sum++]); printf("\n"); } return 0; }
第一次写博客,不妥之处请多多指教!