【C语言训练】求矩阵的两对角线上的元素之和

本文介绍了一个简单的C++程序,该程序用于计算给定N*N矩阵中两条对角线上的元素总和,并提供了完整的代码实现及样例。

题目链接:http://115.28.203.224/problem.php?cid=1010&pid=18

题目描述

求矩阵的两对角线上的元素之和

输入

矩阵的行数N
和一个N*N的整数矩阵a[N][N](N<=10)

输出

所输矩阵的两对角线上的元素之和

样例输入

3
1 2 3
4 5 6
7 8 9

样例输出

25

代码

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a[10][10], N, sum=0;
 6     cin>>N;
 7     for(int i = 0; i < N; i++)
 8         for(int j = 0; j < N; j++)
 9         {
10             cin>>a[i][j];
11             if(i==j || i+j==N-1)
12                 sum += a[i][j];
13         }
14     cout<<sum<<endl;
15     return 0;
16 } 
C语言实现矩阵对角线元素之和,通常需要考虑矩阵阶数的奇偶性,因为奇数阶矩阵对角线会有一个交点,在和时需要避免重复计算。以下是几种不同的实现方法。 #### 方法一:通用方法,适用于任意阶矩阵 ```c #include <stdio.h> int main() { int N; scanf("%d", &N); // 读入矩阵阶数 int a[N][N]; int sum1 = 0, sum2 = 0, sum = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &a[i][j]); // 读入矩阵值 } } for (int i = 0; i < N; i++) { for (int j = i; j <= i; j++) { sum1 = sum1 + a[i][j]; // 读入主对角线元素 } } for (int i = 0; i < N; i++) { for (int j = N - 1 - i; j >= N - i - 1; j--) { sum2 = sum2 + a[i][j]; // 读入副对角线元素 } } if (N % 2 != 0) { // 如果它是奇数阶 sum = sum1 + sum2 - a[N / 2][N / 2]; // 减去主对角线和副对角线重合元素和 } else { sum = sum1 + sum2; // 偶数阶矩阵直接和 } printf("%d", sum); return 0; } ``` 此方法先分别计算主对角线和副对角线元素之和,再根据矩阵阶数的奇偶性进行处理,避免重复计算交点元素[^1]。 #### 方法二:简化版,同样考虑奇偶性 ```c #include <stdio.h> int main() { int n = 0, i = 0, j = 0; int sum1 = 0, sum2 = 0, sum = 0; printf("请输入数组的行列数,(n*n只需n)\n"); scanf("%d", &n); printf("输入数组的行列数为%d*%d\n", n, n); int arr[n][n]; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); } } for (i = 0; i < n; i++) { sum1 += arr[i][i]; sum2 += arr[i][n - 1 - i]; } if (n % 2 == 0) { sum = sum1 + sum2; printf("输入数组的行列数为%d*%d的对角线和为%d\n", n, n, sum); } else { j = n / 2; sum = sum1 + sum2 - arr[j][j]; printf("输入数组的行列数为%d*%d的对角线和为%d\n", n, n, sum); } return 0; } ``` 该方法在读取矩阵元素后,直接计算主对角线和副对角线元素之和,最后根据阶数奇偶性调整结果[^2]。 #### 方法三:特定阶数矩阵(3×3) ```c #include <stdio.h> int main() { int i, j, sum = 0; int a[3][3] = {{9, 3, 3}, {5, 7, 6}, {9, 7, 8}}; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) if (i == j) sum = sum + a[i][j]; printf("主对角线元素和为%d", sum); return 0; } ``` 此方法针对 3×3 矩阵,通过双重循环遍历矩阵,当行索引和列索引相等时,将元素累加到总和中,仅计算主对角线元素之和[^3]。 #### 方法四:同时计算主副对角线元素之和 ```c #include <stdio.h> int main() { int zsum = 0, fsum = 0, arr[6][6]; int i, j, n; printf("输入n\n"); scanf("%d", &n); printf("输入矩阵的值\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &arr[i][j]); if (i == j) zsum += arr[i][j]; if ((i + j + 1) == n) fsum += arr[i][j]; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d\t", arr[i][j]); } printf("\n"); } printf("主对角线之和%d\n,副对角线之和%d", zsum, fsum); return 0; } ``` 该方法在读取矩阵元素时,同时判断元素是否在主对角线或副对角线上,并分别累加和,最后输出主副对角线元素之和[^4]。 #### 方法五:特定阶数矩阵(5×5) ```c #include <stdio.h> int main() { int sum = 0; // 存放累加的值 int arr[][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}; for (int i = 0, j = 0, n = 4; i < 5 && j < 5 && n >= 0; i++, j++, n--) { // 用n来遍历副对角线的值 sum += arr[i][j] + arr[i][n]; } sum -= arr[2][2]; // 减去一次重复的值 printf("%d\n", sum); return 0; } ``` 此方法针对 5×5 矩阵,通过循环同时遍历主副对角线元素,累加和后减去重复的交点元素[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值