为什么可以用(i%2==0 && j%2==0)来表示?怎么得到的?
不好意思,上面给的代码是错的,我现在知道问题了。
对角线有主对角线和次对角线,主对角线是 ( i == j ),次对角线是 ( i + j == 矩阵维度 - 1 ),本例中次对角线是 ( i + j == 2 )。
而(i%2==0 && j%2==0)表示的是行号和列号都是偶数的位置,即下面矩阵为1的位置:
当矩阵维度是3时:
1 0 1 0 1 0 1 0 1
当矩阵维度是4时:
1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1
当矩阵维度是5时:
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
可以发现,当举证维度是3时,行号和列号都为偶数的位置正好是主对角线和次对角线,这只是一个巧合,因为当矩阵维度大于3时,他们的位置并不在主对角线线和次对角线上。
附上正确代码:
#include <stdio.h>int main(){ int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; int i,j; int sum=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(i==j)sum+=arr[i][j]; else if(i+j==2)sum+=arr[i][j]; } } printf("对角线元素之和是:%d\n",sum); return 0; }
对角线条件就俩,1是满足从左上到右下的对角线,特点是i和j相同,
2是满足从左下到右上的对角线,特点是i+j等于2,因为i最大时j最小,i每次加1,j每次减1,两者的和不变
#include <stdio.h>
int main()
{
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++){
if(i == j || i + j == 2){
printf("%d==>%d\n",i,j);
sum +=arr[i][j];
}
}
}
printf("对角线元素之和是:%d\n",sum);
return 0;
}
可以观察对角线元素的下标的特点,一个是行等于列,一个是行加列等于2,所以可以把if()语句写成这样:
if(i == j || (i + j) == 2)
没有必要去关心元素本身的值。
这题对角线是1,5,9和7,5,3 其中的5只记一次。 编写的话因为都是奇数所以用取余
if(arr[i][j]%2!=0)
{sum+=arr[i][j];
无视我的回答吧,我回答得一塌糊涂,是错的
附上正确代码:
#include <stdio.h>
int main()
{
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(i==j)sum+=arr[i][j];
}
printf("对角线元素之和是:%d\n",25);
return 0;
}
对角线元素不应该是( i == j ) 吗?有问题来源吗