这是一个代码,用于将一个矩阵乘以另一个矩阵,同时跳过任何不必要的乘法(其中一个乘数为0)这门课要求我提交但我总是被告知10个案例中有2个不通过,我哪里做错了?我的意思是,我知道它看起来很丑,而且它的效率远不是理想的,但我已经达到了我只想完成它的地步。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main ()
{
int anr, anc, bnr, bnc, i, j;
scanf("%d", &anr);
scanf("%d", &anc);
int a[anr][anc];
for (i=0; i<anr; i++)
{
for (j=0; j<anc; j++)
{
scanf("%d", &a[i][j]);
}
}
scanf("%d", &bnr);
scanf("%d", &bnc);
int b[bnr][bnc];
for (i=0; i<bnr; i++)
{
for (j=0; j<bnc; j++)
{
scanf("%d", &b[i][j]);
}
}
if (anc!=bnr)
{
return 0;
}
else
{
int k;
int out[anr][bnc];
for (i=0;i<anr;i++)
{
for (j=0;j<bnc;j++)
{
out[i][j]=0;
for (i=0;i<anr;i++)
{
for (j=0;j<bnc;j++)
{
out[i][j]=0;
for (k=0;k<bnr;k++)
{
if ((a[i][k]!=0) && (b[k][j]!=0))
{
out[i][j]=a[i][k]*b[k][j]+out[i][j];
}
}
}
}
}
}
for (i=0;i<anr;i++)
{
for (j=0;j<bnc;j++)
{
printf("%d ", out[i][j]);
}
printf("n");
}
}
return 0;
}
看起来您在编写代码和在这里发布代码之间的某个地方犯了复制/粘贴错误-您在相同变量的循环中循环i和j !这显然是个问题。如果不知道实际运行的代码是什么,就不可能详细说明,但有一些事情会对您有更广泛的帮助。
注释你的代码我再怎么强调也不为过。这在任何编程中都很重要,但在数值算法中更是如此。不要依赖你的记忆——你会犯错误,那样你就看不见它们了。简单地浏览代码并注释每个操作将非常明显地表明您对索引进行了两次循环并嵌套,但是很容易连续几个小时查看相同的代码而忽略错误,因为它们成为布景的一部分。
其次,将逻辑尽可能地分成小的部分。与其遍历结果的条目,不如将输出数组初始化为零,然后遍历内部乘积的索引,将初始化移到自己的循环中。将其移回单个循环是一项非常简单的任务,但是将其分离直到您确保有正确的代码是隔离问题并确保(例如,您不会在错误的嵌套级别初始化为零,或者在您计算了一些结果之后)的简单方法。
最后,检查每一步的工作。验证您正在读取a的正确值,然后对b做同样的操作。确保您的输出初始化为零。如果这些都是不正确的,并且您在乘法代码中搜索问题,那么您将永远找不到问题。然后找到一个或多个失败的测试用例——打印出输入和输出。如果问题很明显,那很好。如果没有,看看是否可以构造一个同样失败的更简单的示例,并从那里开始。
这里的首要主题是尽可能地简化和澄清代码。你需要在头脑中记录的越少,就越容易发现问题。如果您稍后想要压缩代码,那么很容易弄清楚每个部分的位置,并且如果您引入了一个问题,您将确切地知道如何,因为您从正确的代码开始。