程序设计与计算思维 - 多维数组
多维数组声明
// 含有 2 个【含有 3 个 int 元素的数组】元素的数组
int a[2][3] = {{1, 2, 3},
{4, 5, 6}}; // 可视作 2 × 3 矩阵,布局以行为主
int b[2][3][4] = {{{1, 2, 3},{4, 5, 6},{7, 8, 9}}
,{{10, 11, 12},{13, 14, 15},{16, 17, 18}}};
操作多维数组的时候通常用多重 for
循环
for (int i = 0;i < 2;i++)
for (int j = 0;j < 3;j++)
cout << a[i][j] << (j < 2 ? ' ' : '\n');
交换循环顺序,相当于输出原来矩阵的转置
for (int j = 0;j < 3;j++)
for (int i = 0;i < 2;i++)
cout << a[i][j] << (i < 1 ? ' ' : '\n');
越界问题
cout << a[0][3]; // 输出 4
越界有时不会运行时错误,但是会返回其他位置的值
简单应用:计算行列式
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const int MAXN = 100 + 10;
int det(int n,double a[][MAXN]) {
int sgn = 1;
for (int i = 1;i <= n;i++) {
int k = -1;
for (int j = i;j <= n;j++)
if (fabs(a[j][i]) > 0) {
k = j; // 找到一行不为 0 的用来消元
break;
}
if (k == -1) return 0;
if (k != i) {
sgn *= -1; // 因为交换第 k 行和第 i 行,行列式变号
swap(a[k],a[i]);
}
for (int j = i+1;j <= n;j++) {
double tmp = a[j][i]/a[i][i];
for (int t = i;t <= n;t++)
a[j][t] -= a[i][t]*tmp; // Rj - Ri * Aji/Aii
}
cout << "-----------------------\n"; // 输出每次消元后的矩阵
for (int j = 1;j <= n;j++,cout << endl)
for (int t = 1;t <= n;t++) cout << setw(5) << a[j][t] << ' ';
}
double result = 1;
for (int i = 1;i <= n;i++)
result *= a[i][i];
return int(result)*sgn;
}
int main() {
double a[MAXN][MAXN];
int n;
cin >> n;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
cin >> a[i][j];
printf("%d",det(n,a));
return 0;
}