天天看点

东华研究生复试------30 特殊的矩阵运算

问题描述 :

输入m个方阵,方阵的元素是非0整数。对于n阶方阵A,明明现在需要进行特殊的运算。

例如:

A: 5 1 3

5 8 7

2 6 9

方阵A有两条对角线:从左上角到右下角的对角线,元素为5 8 9,以及从左下角到右上角的对角线,元素为2 8 3。

求A两条对角线元素相乘的和(对角线积),52+88+9*3=101;

求A两条对角线元素相除的和(对角线商):5/2+8/8+9/3=6。 (注意:求对角线商时用整除,所以5/2的结果为2。)

输入说明 :

输入由多组数据组成。

  1. 第一行有一个整数m,表示接下来有m组测试数据;
               
  2. 第二行有一个整数n,表示n阶方阵,0 < n < 10;
               
  3. 接下来的m行,每行有n*n个非0整数,整数间用空格分隔,每行对应一个矩阵。例如上述方阵A的输入格式为:5 1 3 5 8 7 2 6 9
               

输出说明 :

对每个矩阵,输出两个整数,表示对角线积和对角线商,用空格分隔。每个矩阵的输出结果占一行。

输入范例:

2

3

5 1 3 5 8 7 2 6 9

-2 3 2 1 2 49 22 1 2

输出范例 :

101 6

-36 2

害,自己搞麻烦了,又整了半天=~=,什么时候才可以变厉害啊,菜死了

#include<stdio.h>
#include<stdlib.h>
int main(){
	int m,n,i,j,**a,sum1,sum2,x1,x2;
	scanf("%d",&n);
	scanf("%d",&m);
	
	while(n--){
		a=(int**)malloc(sizeof(int*)*m);
		for(i=0;i<m;i++){
			a[i]=(int*)malloc(sizeof(int)*m);
		}
		for(i=0;i<m;i++){
			for(j=0;j<m;j++){
				scanf("%d",&a[i][j]);
			}
		}
//从列先开始遍历
		sum1=0;sum2=0;
		for(j=0;j<m;j++){
			x1=a[j][j];//这就是左上到右下的元素值,易找
			for(i=0;i<m;i++){
				if((m-1)==i+j){//这是左下到右上的元素
					x2=a[i][j];
					break;
				}
				
			}
			sum1+=x1*x2;
			sum2+=(x1/x2);
		}
	
	printf("%d %d\n",sum1,sum2);
	}

	return 0;
}