算法笔记练习 4.1 排序 问题 E: Problem B

本文介绍了一个算法问题,即计算m行m列方阵的每一行、每一列及主对角线元素之和,并按从大到小顺序输出。文章详细描述了算法的实现过程,包括使用二维数组接收矩阵、对行、列和对角线求和、排序和输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法笔记练习 题解合集

题目链接

题目

题目描述
请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。

输入
共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。

输出
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。

样例输入
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69

样例输出
159 145 144 135 81 60 44 32 28 27

思路

  1. 用二维数组接收矩阵
  2. 定义一个长度为 2*m+1 的 answer 数组
  3. 分别对每行、每列、两条对角线求和,将结果放入 answer
  4. 对 answer 排序并输出

代码

#include <stdio.h>
#include <stdlib.h>
// qsort 排序函数
int cmpInt(const void *ca, const void *cb); 
int main(){
	int m, i, j;
	while (scanf("%d", &m) != EOF){
		int square[m][m];
		int answer[2 * m + 2];
		for (i = 0; i < m; ++i)
			for (j = 0; j < m; ++j)
				scanf("%d", &square[i][j]);
		int sum = 0;
		int *pans = answer;
		// 对每一列求和并写入 answer
		for (i = 0; i < m; ++i){
			for (j = 0; j < m; ++j)
				sum += square[i][j];
			*pans++ = sum;
			sum = 0;
		}
		// 对每一行求和并写入 answer
		for (i = 0; i < m; ++i){
			for (j = 0; j < m; ++j)
				sum += square[j][i];
			*pans++ = sum;
			sum = 0;
		}
		// 对正对角线求和并写入 answer
		for (i = 0; i < m; ++i)
			sum += square[i][i];
		*pans++ = sum;
		sum = 0;
		// 对副对角线求和并写入 answer
		for (i = 0; i < m; ++i)
			sum += square[i][m-i-1];
		*pans++ = sum;
		sum = 0;
		// 排序,输出
		qsort(answer, 2 * m + 2, sizeof(int), cmpInt);
		for (i = 0; i < 2 * m + 2; ++i)
			printf("%d ", answer[i]);
		putchar('\n'); 
	} 
	return 0;
} 

int cmpInt(const void *ca, const void *cb){
	int ret = 0;
	int a = *(int*)ca;
	int b = *(int*)cb;
	if (a > b)
		ret = -1;
	else if (a < b)
		ret = 1;
	return ret; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值