1.常规
void yht() {
//Yang Hui triangle 杨辉三角
//第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和;
int a[7][7], i, j;
for (i = 0; i < 7; i++)
{
a[i][0] = 1;//第0列
a[i][i] = 1;//对角线
}
//从第三行第二列开始赋值,第几行就有几列
for (i = 2; i < 7; i++)
{
for (j = 1; j < i; j++)
{
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
//打印格式,第几行就有几列
for (i = 0; i < 7; i++)
{
for (j = 0; j <= i; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
}
2.指针实现
void yhtp() {
//Yang Hui triangle 杨辉三角,用指针实现
//第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和;
int a[7][7], i, j;
for (i = 0; i < 7; i++)
{
*(*(a + i))= 1;// &a[i][0]==>*(a+i)+0//数组名作地址生成第0列
*(a[i] + i) = 1;// &a[i][i]==>a[i]+i//行地址方式生成对角线
}
//从第三行第二列开始赋值,第几行就有几列
for (i = 2; i < 7; i++)
{
for (j = 1; j < i; j++)
{
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];//下标方式
}
}
//打印格式,第几行就有几列
for (i = 0; i < 7; i++)
{
for (j = 0; j <= i; j++)
{
printf("%3d",*(a[i] + j));// &a[i][j]==>a[i]+j==>*(a+i)+j
}
printf("\n");
}
}
3.指针实现的另类解法
void yhtp2() {
int a[7][7] = {1}, i, j, *p;
a[1][0] = 1;
//从第1行的第1个元素开始赋值
for (p =&a[1][1];p<=&a[6][6];p++)
{
//a[i][j]就是顺序排序中第i*N+j个元素地址为p,值等于第i*N+j-N(即p-N)和第i*N+j-N-1(即p-N-1)的值的和
*p = *(p - 7) + *(p - 7 - 1);
}
for (i = 0; i < 7; i++)
{
p = &a[i][0];
for ( j = 0; j <=i; j++,p++)
{
printf("%3d",*p);
}
printf("\n");
}
}
运行:
int main() {
printf("\n第一种常规解法:\n");
yht();
printf("\n第二种指针解法:\n");
yhtp();
printf("第三种指针的另类解法:\n");
yhtp2();
}
运行结果:
参考:《C语言程序设计》杜友福