编写程序,输入整数n(2<=n<=10)、n阶方阵A,计算A的逆矩阵并输出。要求使用指针进行操作,矩阵存储采用动态内存分配,矩阵元素为double类型,最终结果四舍五入保留两位小数输出,矩阵不可逆则输出0。 示例: 输入: 3 1 2 3 4 5 6 7 2 9 输出(一行中每个元素间有一个空白字符): -0.92 0.33 0.08 -0.17 0.33 -0.17 0.75 -0.33 0.08 用C语言书写
时间: 2024-02-09 07:10:36 浏览: 116
以下是使用高斯-约旦消元法计算矩阵的逆的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 获取矩阵的子矩阵
void get_sub_matrix(double **a, double **b, int n, int row, int col) {
int i, j, p = 0, q = 0;
for (i = 0; i < n; i++) {
if (i != row) {
for (j = 0; j < n; j++) {
if (j != col) {
b[p][q++] = a[i][j];
}
}
p++;
q = 0;
}
}
}
// 计算矩阵的行列式
double calc_det(double **a, int n) {
int i, j, k;
double det = 1, temp;
for (i = 0; i < n; i++) {
for (j = i+1; j < n; j++) {
if (a[j][i] != 0) {
temp = a[j][i] / a[i][i];
for (k = i; k < n; k++) {
a[j][k] = a[j][k] - temp * a[i][k];
}
}
}
det *= a[i][i];
if (det == 0) break;
}
return det;
}
// 计算矩阵的伴随矩阵
void calc_adj_matrix(double **a, double **adj, int n) {
int i, j, sign;
double **sub_matrix = (double **) malloc(sizeof(double *) * (n-1));
for (i = 0; i < n-1; i++) {
sub_matrix[i] = (double *) malloc(sizeof(double) * (n-1));
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sign = (i+j) % 2 == 0 ? 1 : -1;
get_sub_matrix(a, sub_matrix, n, i, j);
adj[j][i] = sign * calc_det(sub_matrix, n-1);
}
}
for (i = 0; i < n-1; i++) {
free(sub_matrix[i]);
}
free(sub_matrix);
}
// 计算矩阵的逆
void calc_inverse_matrix(double **a, double **inv, int n) {
int i, j;
double det = calc_det(a, n);
if (det == 0) {
printf("0\n");
return;
}
double **adj = (double **) malloc(sizeof(double *) * n);
for (i = 0; i < n; i++) {
adj[i] = (double *) malloc(sizeof(double) * n);
}
calc_adj_matrix(a, adj, n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
inv[i][j] = adj[i][j] / det;
}
}
for (i = 0; i < n; i++) {
free(adj[i]);
}
free(adj);
}
int main() {
int n, i, j;
scanf("%d", &n);
double **a = (double **) malloc(sizeof(double *) * n);
double **inv = (double **) malloc(sizeof(double *) * n);
for (i = 0; i < n; i++) {
a[i] = (double *) malloc(sizeof(double) * n);
inv[i] = (double *) malloc(sizeof(double) * n);
for (j = 0; j < n; j++) {
scanf("%lf", &a[i][j]);
}
}
calc_inverse_matrix(a, inv, n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%.2lf ", inv[i][j]);
}
printf("\n");
}
for (i = 0; i < n; i++) {
free(a[i]);
free(inv[i]);
}
free(a);
free(inv);
return 0;
}
```
注意,由于计算矩阵的逆需要计算矩阵的行列式和伴随矩阵,因此代码中分别实现了这两个函数。另外,计算伴随矩阵的代码中还需要获取矩阵的子矩阵,因此又实现了一个函数用于获取子矩阵。最后,由于题目要求最终结果四舍五入保留两位小数输出,因此需要在输出时使用printf函数的%.2lf格式控制符。
阅读全文