[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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值