我给了这个我想在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个输出。我在编写上面的伪代码时出错吗?此外,什么是开始和结束;假设代表?
答案 0 :(得分:2)
你的伪代码也是O(n ^ 3),所以翻译没有错。
开头和结尾最有可能显示第二个for-statement的范围(我认为缩进是足够的但对于具有其他语言背景的人来说可能不太自然。)
答案 1 :(得分:2)
看起来很像Pascal
vs C
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;
“begin and 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
。