代码如下。你自己把它改为通用的子函数吧!
算法很简单:先搞定第一列,然后再搞定每一行的剩余元素。
#include
#include
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("\n");
}
for(i = 0; i < n; i++)
{
free(a[i]);
}
free(a);
return 0;
}