英文:
Skipping Diagonal Elements Within a Square Matrix
问题
写了一个程序来显示一个方阵(例如:5x5),我试图计算排除对角线上的元素的总数(从左上到右下和从左下到右上)
示例:
在一个5x5的矩阵中,只有`X`会被计算
O X X X O
X O X O X
X X O X X
X O X O X
O X X X O
因此:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
总计:16
或者
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
总计:32
以下是我的代码
```cpp
int calculateVal(int **mat, int size)
{
int count = 0;
for (int row = 0; row < size; row++)
{
for (int col = 0; col < size; col++)
{
if (isRightDiagonal(size, row, col) == true ||
isLeftDiagonal(size, row, col) == true)
{
col++;
}
count += mat[row][col];
}
}
return count;
}
bool isRightDiagonal(int size, int row, int col)
{
return (col == abs(row - size)) ? true : false;
}
bool isLeftDiagonal(int size, int row, int col)
{
return (row == abs(col - size)) ? true : false;
}
英文:
Wrote a program to display a square matrix (ex: 5x5) and I am trying to count the total of the elements excluding the elements that lie within a diagonal line (from top left to bottom right & from bottom left to top right)
EX:
In a 5x5 matrix, only the X
s would be counted
O X X X O
X O X O X
X X O X X
X O X O X
O X X X O
Thus:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
Total: 16
OR
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
2 2 2 2 2
Total: 32
Here is my code
int calculateVal(int **mat, int size)
{
int count = 0;
for (int row = 0; row < size; row++)
{
for (int col = 0; col < size; col++)
{
if (isRightDiagonal(size, row, col) == true ||
isLeftDiagonal(size, row, col) == true)
{
col++;
}
count += mat[row][col];
}
}
return count;
}
bool isRightDiagonal(int size, int row, int col)
{
return (col = abs(row - size)) ? true : false;
}
bool isLeftDiagonal(int size, int row, int col)
{
return (row = abs(col - size)) ? true : false;
}
I tried using an if statement to check if the element is within a diagonal, and if so, skipping to the next element, but the output is wrong.
The test case I have been primarily using is a 5x5 of 1s like the example above; however, the total prints out as 10 rather than 16
答案1
得分: 1
对角线的测试是错误的:
- 如果
col == row
,元素属于左对角线 - 如果
size - 1 - col == row
,元素属于右对角线
此外,如果元素属于任何一个对角线,应该忽略它,递增 col
是错误的,因为它可能使 mat[row][col]
引用矩阵之外的元素,导致未定义的行为。
以下是修改后的版本:
int calculateVal(int **mat, int size) {
int count = 0;
for (int row = 0; row < size; row++) {
for (int col = 0; col < size; col++) {
if (col != row && size - 1 - col != row) {
count += mat[row][col];
}
}
}
return count;
}
英文:
The tests for the diagonals are incorrect:
- an element is part of the left diagonal if
col == row
- an element is part of the right diagonal if
size - 1 - col == row
Furthermore, if the element is part of either diagonal, it should just be ignored, incrementing col
is incorrect as it may make mat[row][col]
refer en element outside the matrix, causing undefined behavior.
Here is a modified version:
int calculateVal(int **mat, int size) {
int count = 0;
for (int row = 0; row < size; row++) {
for (int col = 0; col < size; col++) {
if (col != row && size - 1 - col != row) {
count += mat[row][col];
}
}
}
return count;
}
答案2
得分: 0
使用一个包含1的示例矩阵来标记你不想计算的条目(如果你将它们相加而不是计算它们,那么值就不为0,那么你就知道出现了问题)。你可以使用一个类似的精心制作的矩阵来确保你所关心的16个条目被计算:
#include <stdio.h>
#include <stdlib.h>
int main() {
int matrix[][5] = {
{1, 0, 0, 0, 1},
{0, 1, 0, 1, 0},
{0, 0, 1, 0, 0},
{0, 1, 0, 1, 0},
{1, 0, 0, 0, 1}
};
size_t sum = 0;
const size_t n = sizeof matrix / sizeof *matrix;
for(size_t r = 0; r < n; r++)
for(size_t c = 0; c < n; c++)
sum += (r != c && r + c + 1 != n) * matrix[r][c];
printf("sum = %zu\n");
}
如果你不喜欢无分支的样式,还有另一种表达方式:
if(r != c && r + c + 1 != n)
sum += matrix[r][c];
英文:
Using a sample matrix with 1 for the entries you don't want to count (if you sum them instead of count then the value is not 0 then you know something is off). You could use a similar crafted matrix to ensure that the the 16 entries you are interested in are counted:
#include <stdio.h>
#include <stdlib.h>
int main() {
int matrix[][5] = {
{1, 0, 0, 0, 1},
{0, 1, 0, 1, 0},
{0, 0, 1, 0, 0},
{0, 1, 0, 1, 0},
{1, 0, 0, 0, 1}
};
size_t sum = 0;
const size_t n = sizeof matrix / sizeof *matrix;
for(size_t r = 0; r < n; r++)
for(size_t c = 0; c < n; c++)
sum += (r != c && r + c + 1 != n) * matrix[r][c];
printf("sum = %zu\n", sum);
}
If you don't like the non-branching style here is another way to express it:
if(r != c && r + c + 1 != n)
sum += matrix[r][c];
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论