检查数组是否为C中的对角线优势矩阵

问题描述 投票:0回答:2

我在为我的学习编写任务时遇到问题-一种检查2d数组是否为对角占优矩阵的算法。

为此,我做了一个功能:

      int dd_test(const int *ptr, int width, int height){

      if (width!=height)
        return -1;

      int sum=0;
      int j;

      for (int i=0;i<width;i++){
          for(j=0;j<height;j++){
            if(i!=j){
              if(*((ptr+i*width)+j)!=0)
                sum+=abs(*((ptr+i*width)+j));
              else
                continue;
            }
          }
          if(*((ptr+i*width)+j)<=sum)
            return 0;
          else if (*((ptr+i*width)+j)>sum)
            sum = 0;
      }
      return 1;
    }

首先,它检查它是否为方矩阵,然后检查对角线上的数字是否为该行中最大的数字。如果不是,则算法返回0;否则返回0。如果是算法,则转到下一行并再次执行。主要功能如下:

    int main(void) {
  int wid=5, he=5;
  int matrix[5][5]={0};
  int *ma=matrix[0];

  puts("Input a 5x5 matrix: ");
  for(int i=0;i<5;i++){
      if(scanf("%d %d %d %d %d",(ma+i*wid),((ma+i*wid)+1),((ma+i*wid)+2),((ma+i*wid)+3),((ma+i*wid)+4))!=5){
        puts("Incorrect input");
        return 1;
      }
  }

  if(dd_test(ma, wid, he)==1)
    puts("YES");
  else if (dd_test(ma, wid,he)==0)
    puts("NO");

  return 0;
}

问题是它总是返回0。我找不到错误,请帮助我。我真的觉得精疲力尽。

谢谢。

c pointers multidimensional-array diagonal
2个回答
0
投票

我对您的dd_test进行了一些修改。您正确累积了每一行的非对角线分量,但最终要求对角线分量的值错误。

在您询问*((ptr+i*width)+j)时,j将等于高度。相反,您应该使用i,因为当前行的高度也等于该行的对角线分量的位置。

int dd_test(const int* ptr, int width, int height) {
    if (width != height)
        return -1;

    int sum = 0;

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            if (i != j) {
                sum += abs(*((ptr + i * width) + j));
            }
        }
        if (*((ptr + i * width) + i) <= sum)
            return 0;
        else if (*((ptr + i * width) + i) > sum)
            sum = 0;
    }
    return 1;
}

希望这会有所帮助。


0
投票

您应该使用ptr[i*width+j]而不是*((ptr+i*width)+j),因为它更易于阅读代码。

您的条件不正确:

          if(*((ptr+i*width)+j)<=sum)
            return 0;
          else if (*((ptr+i*width)+j)>sum)
            sum = 0;

应更改为:

         if(ptr[i*width+i]< sum) // it's similar to if(*((ptr+i*width)+i)< sum)
            return 0;
         else 
            sum = 0;

您可以通过删除if else循环中的for条件来使代码更短:

int dd_test(const int *ptr, int width, int height){

    if (width!=height)
        return -1;
    int j, sum = 0;

    for (int i=0;i<width;i++) {
        sum = 0;
        for(j=0;j<height;j++)
            sum += abs(ptr[i*width+j]);
        sum -= abs(ptr[i*width+i]);

        if(ptr[i*width+i] < sum)
            return 0;
    }
     return 1;
}

© www.soinside.com 2019 - 2024. All rights reserved.