下面用两种方法解决这个题目
第一种方法就比较常规
#include<stdio.h>
int main (){
int n,i,j;
int sum=0,sum1=0,sum2=0;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i==j)//主对角线之和
sum1=sum1+a[i][j];
if(i+j==n-1)//副对角线之和
sum2=sum2+a[i][j];
}
}
if(n%2==0){//如果是偶数个数的矩阵,不用减去中间重复的数字
sum=sum1+sum2;
printf("%d",sum);
}
if(n%2==1){//如果是奇数个数的矩阵,减去中间重复的数字
sum=sum1+sum2-a[n/2][n/2];
printf("%d",sum);
}
return 0;
}
第二种和第一钟类似,但进行了优化
#include<stdio.h>
int main()
{
int n,i,j,sum=0;
scanf("%d",&n);
int a[n];
for (i=0;i<n;i++){
for(j=0;j<n;j++){ //和二维数组类似,当外层不动的时候,这里输入的是这一行的数字
scanf("%d",&a[j]);
}
sum=sum+a[i]+a[n-i-1];//这里a[i]是主对角线上的数字,a[n-i-1]是副对角线上面的数字
if((n%2!=0)&&(i==((n+1)/2)-1)){
//当是奇数矩阵时,第二个条件的意思是中间的那个重复加上去的数字
//每一行都是n个数,n+1能满足是中间那个,然后减一是因为数组都是从零开始的
sum=sum-a[i];
}
}
printf("%d",sum);
return 0 ;
}