我在为我的学习编写任务时遇到问题-一种检查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。我找不到错误,请帮助我。我真的觉得精疲力尽。
谢谢。
我对您的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;
}
希望这会有所帮助。
您应该使用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;
}