[OJ] 二维数组作为参数传递给函数

以如下面试题为例:

给定矩阵的行数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!

原创文章 42 获赞 15 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Codeliang666/article/details/103994658
OJ