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]。