1

我得到了我想用 C 重写的代码。目的是矩阵 A 和 B 相乘。

for i := 1 to n do
    for j := 1 to n do
    begin
        C[i,j] := 0;
        for k := 1 to n do
            C[i,j] := C[i,j] + A[i,k]*B[k,j]
    end;

我的 C 翻译:

int main(int argc, const char * argv[])
{
    int n = 2; //for testing
    int i = n;
    int j = n;
    int k = n;

    int A[i][k];
    int B[k][j];
    int C[i][j];

    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
        {
            C[i][j]=0;
            for (int k=0; k<n; k++)
            {
                C[i][j] = C[i][j]+A[i][k]*B[k][j];
                printf("A[%d][%d]*B[%d][%d]\n", i, k, k, j);
            }
            printf("\n");
        }
    }
}

但是,当我测试它时,我得到 n^3 个输出。我在编写上述伪代码时是否出错?此外,什么是开始和结束;假设代表?

4

2 回答 2

2

你的伪代码也是 O(n^3) 所以翻译没有错。

开头和结尾最有可能显示第二个 for 语句的范围(我认为缩进就足够了,但对于具有其他语言背景的人来说可能并不自然。)

于 2013-10-15T21:28:35.067 回答
2

看起来很像PascalvsC

for i := 1 to n do
  for j := 1 to n do
  begin  
    C[i,j] := 0;
    for k := 1 to n do
      C[i,j] := C[i,j] + A[i,k]*B[k,j]
  end;

“开始和结束”是“{”和“}”的 Pascal 等价物。

for (i = 1; i<= n; i++) {
  for (j = 1; j<= n; j++) {
    C[i][j] = 0;
    for (k = 1; k<= n; k++) {
      // Leave printf here to see O(n^3) computations
      C[i][j] += A[i][k]*B[k][j] ;
    }
    // Move printf outside of inner loop to only see n^2 results.
    // printf("A[%d][%d]*B[%d][%d]\n", i, k, k, j);
    printf("C[%d][%d] = %d\n", i, j, C[i][j]);
  }
}

OP 可能想要使用double而不是int.

于 2013-10-15T21:34:25.150 回答