代码如下。你自己把它改为通用的子函数吧!
算法很简单:先搞定第一列,然后再搞定每一行的剩余元素。
include <stdio.h>
include <alloc.h>
int main(void)
{
int i, j;
int k; //存储修正值,即偏移量
int n 20; //需要打印的行数,你可以修改测试本程序
int **a; //存储动态数组
a (int **)malloc(n * sizeof(int *)); //分配动态数组
for(i 0; i < n; i++)
{
a[i] (int *)malloc(n * sizeof(int));
}
a[0][0] 0;
for(i 1, k n; i < n; i++)
{
a[i][0] a[i - 1][0] + (k--); //填充二维数组的第一列
}
for(i 1; i < n; i++)
{
for(j 1, k 0; j < i; j++)
{
a[i][j] a[i][j - 1] - (n - i) - (k++); //填充二维数组的每一行的(斜三角部分的)剩余位置
}
}
for(i 0; i < n; i++)
{
for(j 0; j < i; j++)
{
printf("%-4d", a[i][j] + 1); //注意:数组的初始化是以0开始的,这里以1开始输出
}
printf("&92;n");
}
for(i 0; i < n; i++)
{
free(a[i]);
}
free(a);
return 0;
}