c - 在C中替换矩阵中的元素
问题描述
我需要检查矩阵主对角线上的元素是否是偶数并且是否可以整除为其索引之和。我记得一维数组中的这些元素:
for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
{
if ((i == j) && ((arr[i][j] % 2) == 0))
{
arr2[count] = arr[i][j];
++count;
break;
}
}
然后我将满足条件的元素替换为其索引之和,并为 [0][0] 放置一个特殊条件,因为除以 0:
count = 0;
for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
{
if ((i+j != 0) && (arr[i][j] == arr2[count]) && ((arr[i][j] % (i+j)) == 0))
{
arr[i][j] = i+j;
++count;
}
else if (((i+j) == 0) && (arr[i][j] == arr2[count])) arr[i][j] = 0;
}
麻烦的是,当第一个元素是偶数时,它是唯一被替换的数字,并且该条件不适用于其他元素:
解决方案
问题:
arr2
没有适当填写。一旦你将一个元素填入其中,你就会跳出那个循环。break
注意在那个循环中的用法。此外,您没有更新count
else-if 条件中的值,这会导致您的循环徒劳地在整个搜索过程中运行arr2[0]
。
解决方案:
删除该
break
声明。添加
++count
到那个 else-if 条件中。
奖金:
你写了丑陋的代码。您使用了一个额外的数组,这增加了代码的空间复杂度,并且您有太多的循环,这也增加了时间复杂度。随着您的进步,您稍后会理解这些事情,但现在,我会给您一个更好的解决方案:
// Deal with the (0, 0) case outside the loop
// And avoid an extra else-if inside the loop
if (arr[0][0] % 2 == 0)
arr[0][0] = 0;
// There are n diagonal elements in a matrix of order n
// Row and column indexes of a diagonal element are equal
// So you can eliminate the use of j and just rely on i
for (i = 1; i < n; ++i)
// Check if the diagonal element is even and divisible by the sum of the indices
if (arr[i][i] % 2 == 0 && arr[i][i] % (i + i) == 0)
// Replace the element if the condition is satisfied
arr[i][i] = i + i;
如您所见,这种方法不需要任何额外的空间,并且可以在非常好的线性时间内运行。您可以通过使用按位与检查一个数字是否不是奇数来进一步优化它,并使用按位左移运算符快速!(i & 1)
更改i + i
为奇数。2 * i
(i << 1)
对了,你为什么要arr[0][0]
换人?除以 0 是未定义的。
推荐阅读
- symfony4 - 如何使用角色过滤表单中的 EntityType?
- python - 防止 Cassandra Query 从缓存中受益
- fortran - Fortran 子例程:如何仅在第一次调用时加载数据
- php - 具有类别/专业的自定义组件和 router.php
- python - 使用 Selenium 接受 IE 网页对话框
- assembly - 如何使用汇编制作小型二进制文件?
- express - 如何将 req.sessionID 转换为 connect.sid?
- javascript - utils.device.checkHasPositionalTracking() 函数是否仍然存在?
- angular - Angular中的动态网格
- sql - 不同条件(类似于 IF)+ uniqe 值