动态2D阵列的特定行的意外输出

时间:2016-07-04 20:11:12

标签: c

我正在解决显示Pascal三角形的编程问题。在代码中,我将每行的最后一个元素设置为零。尽管如此,第6行产生的输出为最后一个元素的50。我无法弄清楚原因。请帮助。代码已附上。

int ** generate(int A, int *number_of_rows) {

    *number_of_rows = A;
    int i,j,nc=0;
    int **result = (int**)malloc(A * sizeof(int *));


    for(i=0;i<A;i++)
    {
        nc=i+1;
        result[i]=(int)malloc(nc*sizeof(int));
        result[i][0]=nc;
        result[i][1] = 1;
        for(j=2;j<nc;j++)
        {

            result[i][j]=result[i-1][j]+result[i-1][j-1];
        }
    }
    return result;
}

编辑:

每行的第一个元素显示该行中的列数。

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

int ** generate(int A, int *number_of_cols) {
    int **result = malloc(A * sizeof(int *));
    int nc;//number of columns

    for(int i = 0; i < A; ++i){
        number_of_cols[i] = nc = i + 1;
        result[i] = malloc(nc * sizeof(int));
        result[i][0] = result[i][nc-1] = 1;
        if(i > 1)
            for(int j = 1; j < nc -1; ++j){
                result[i][j] = result[i-1][j-1] + result[i-1][j];
            }
    }
    return result;
}
int main(void){
    int n;
    scanf("%d", &n);

    int *number_of_cols = malloc(n * sizeof(int));
    int **pascal_triangle = generate(n, number_of_cols);

    for(int i = 0; i < n; ++i){
        printf("%*s", 2 * (n-i-1), "");
        for(int j = 0; j < number_of_cols[i]; ++j){
            printf("%4d", pascal_triangle[i][j]);
        }
        puts("");
        free(pascal_triangle[i]);
    }
    free(pascal_triangle);
    free(number_of_cols);

    return 0;
}

答案 1 :(得分:1)

我无法理解传递 * number_of_row 的目的只是为了为其分配其他参数地址。但是,我将主要的 for 循环拆分为2: 一个用于分配所有内存,另一个用于填充它。

for(i=0;i<A;i++)
  result[i]=(int)malloc((i+1)*sizeof(int));

result[0][0]=1; //in your code, result[i-1] was accessed with i=0
for(i=1;i<A;i++) {
  result[i][0] = i+1;
  result[i][1] = 1;
  for(j=2;j<i;j++)
    result[i][j] = result[i-1][j] + result[i-1][j-1]; //when j reaches the last value, 
                       //[i-1][j] won't work! So put j<i instead.
  result[i][j] = 1;
}

其余代码没问题,请检查这是否是您想要的。产生的三角形应该是:

1
2   1
3   1  1
4   1  2  1
5   1  3  3  1
6   1  4  6  4  1 etc.