【问题标题】:Removing elemenets from the matrix diagonals从矩阵对角线中删除元素
【发布时间】:2021-04-16 19:24:13
【问题描述】:

我想从矩阵中的主对角线和辅助对角线中删除元素以获得一个新矩阵,但是我的代码不能正常工作。似乎第二个 for 循环有问题。我试图改变它,但它没有再次工作。我希望你能帮助我。 此代码应仅适用于偶数尺寸

#include <stdio.h>

int main() {
  int m[50][50], i, j, k, n;
  printf("Dimensions: \n");
  scanf("%d", &n);
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &m[i][j]);
    }
  }
   for(i=0;i<n;i++){
        for(j=0;j<n;j++){
           for(k=j+1;k<n;k++){
               if(i==j)
                  m[i][k-1]=m[i][k];
               if(i+j+1==n)
                  m[i][k]=m[i][k-1];
            }
        }
    }
  printf("The new matrix: \n");
  for (i = 0; i < n; i++) {
    for (j = 0; j < n - 2; j++) {
      printf("%d ", m[i][j]);
    }
    printf("\n");
  }
}
// Input: 
         -69 -85   1   0
           1  -8   2 -44
          -2   5   8 -11
           1 -11   0   5
   Expected output:
         -85   1    
           1 -44  
          -2 -11  
         -11   0   
  Output of my code:
         -85   1    
         -44   2    
         -11   5    
           1 -11 

【问题讨论】:

  • 这段代码对于这个简单的任务来说太大了。主对角线就是m[i][i] 元素。可以通过简单的修改类似地访问辅助节点。
  • 在第三组循环中,当j == 0k - 2 可以是-1,这会破坏索引。
  • @EugeneSh。很抱歉把所有的东西都写得很详细,但如果我不写,人们会抱怨它不可读
  • 这个就不详细了。您正在用 O(n^2) 编写一个简单的 O(n) 算法。
  • @WeatherVane 我尝试将其更改为k-1,但代码仍然不起作用

标签: arrays c matrix


【解决方案1】:

您不需要 3 个嵌套的 for 循环来执行此操作。

您可以使用 2 个嵌套循环来做到这一点。使用一个额外的变量来表示下一个元素的目的地。

尝试类似:

   for(i=0;i<n;i++){
        int write_index = 0;
        for(j=0;j<n;j++){
            if (j != i && j != (n-1-i))
            {
                m[i][write_index] = m[i][j];
                ++write_index;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2022-01-07
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2014-09-21
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多