以如下面试题为例:
给定矩阵的行数N,和一个N*N的整数矩阵(方阵)(n<=10)
要求输出所输矩阵的两对角线上的元素之和
样例输入
3
1 2 3
4 5 6
7 8 9
样例输出
25
我一开始是按照下面这样写的:
#include <stdio.h>
int matrix(int *a,int n,int m);
int main (){
int n=0;
scanf("%d",&n);
int a[n][n];
int ret=0;
int i,j;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
ret=matrix(&a[0][0],n,n);
printf("%d\n",ret);
return 0;
}
int matrix(int *a,int n,int m){
int i;
int j;
int sum1=0;
int sum2=0;
int sum=0;
for (i=0;i<n;i++){
for (j=0;j<m;j++){
if (i==j){
sum1=sum1+*(a + i*m + j);
}
if (i+j==m-1){
sum2 =sum2+*(a + i*m + j);
}
}
}
sum = sum1+sum2;
return sum;
}
其实有问题,我想了想没有考虑,n为奇数时,此时方阵最中间的一个值被重复计算了,于是修改如下:
#include <stdio.h>
int matrix(int *a,int n);
int main (){
int n=0;
scanf("%d",&n);
int a[n][n];
int ret=0;
int i,j;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
ret=matrix(&a[0][0],n);
printf("%d\n",ret);
return 0;
}
int matrix(int *a,int n){
int i;
int j;
int sum1=0;
int sum2=0;
int sum=0;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
if (i==j){
sum1=sum1+*(a + i*n + j);
}
if (i+j==n-1){
sum2 =sum2+*(a + i*n + j);
}
}
}
if ( n%2 ==0){
sum = sum1+sum2;
}
else {
sum =sum1+sum2-*(a+ (n/2)*n+n/2);
}
return sum;
}
总结: 这种方法利用了数组是顺序存储的特性, 通过了降维来访问原数组。
OVER!