编写C语言程序,输入整数n(2<=n<=10)、n阶方阵A,计算A的逆矩阵并输出。要求使用指针进行操作,矩阵存储采用动态内存分配,矩阵元素为double类型,最终结果四舍五入保留两位小数输出,矩阵不可逆则输出0。 示例: 输入: 3 1 2 3 4 5 6 7 2 9
时间: 2023-06-09 20:06:57 浏览: 99
编写程序,输入整数 n,计算并输出 n 的阶乘
很高兴为您解答这个问题。下面是 C 语言程序的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double *get_matrix(int n) {
double *matrix = (double *)malloc(n * n * sizeof(double));
if(matrix == NULL) {
printf("内存分配失败!\n");
exit(1);
}
return matrix;
}
void free_matrix(double *matrix) {
free(matrix);
}
void input_matrix(double *matrix, int n) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%lf", matrix + i * n + j);
}
}
}
void print_matrix(double *matrix, int n) {
printf("矩阵:\n");
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%8.2lf", matrix[i * n + j]);
}
printf("\n");
}
}
double determinant(double *matrix, int n) {
double det = 0;
double *temp_matrix;
if(n == 1) {
return matrix[0];
}
if(n == 2) {
return matrix[0] * matrix[3] - matrix[1] * matrix[2];
}
temp_matrix = get_matrix((n - 1) * (n - 1));
for(int k = 0; k < n; k++) {
int i, j, l;
for(i = 1; i < n; i++) {
for(j = 0, l = 0; j < n; j++) {
if(j != k) {
temp_matrix[(i - 1) * (n - 1) + l] = matrix[i * n + j];
l++;
}
}
}
det += matrix[k] * pow(-1, k) * determinant(temp_matrix, n - 1);
}
free_matrix(temp_matrix);
return det;
}
void cofactor(double *matrix, int n, double *cofactor_matrix) {
double *temp_matrix;
if(n == 1) {
cofactor_matrix[0] = 1;
return;
}
temp_matrix = get_matrix((n - 1) * (n - 1));
for(int k = 0; k < n; k++) {
int i, j, l, m;
for(i = 0; i < n - 1; i++) {
for(j = 0; j < n - 1; j++) {
l = i >= k ? i + 1 : i;
m = j >= k ? j + 1 : j;
temp_matrix[i * (n - 1) + j] = matrix[l * n + m];
}
}
int sign = (k % 2 == 0) ? 1 : -1;
double temp_det = determinant(temp_matrix, n - 1);
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
if(i == k || j == k) continue;
int ii = (i < k) ? i : i - 1;
int jj = (j < k) ? j : j - 1;
cofactor_matrix[ii * (n - 1) + jj] += sign * temp_matrix[(i < k) ? i : i - 1] * temp_matrix[(j < k) ? j : j - 1] / temp_det;
}
}
}
free_matrix(temp_matrix);
}
void inverse_matrix(double *matrix, int n, double *inverse_matrix) {
double det = determinant(matrix, n);
if(fabs(det) < 1e-10) {
printf("矩阵不可逆!\n");
return;
}
double *temp_matrix = get_matrix((n - 1) * (n - 1));
cofactor(matrix, n, temp_matrix);
for(int i = 0; i < n * n; i++) {
inverse_matrix[i] = temp_matrix[i] / det;
}
free_matrix(temp_matrix);
}
int main() {
int n;
double *matrix, *inverse_matrix;
printf("请输入矩阵的阶数:");
scanf("%d", &n);
matrix = get_matrix(n);
inverse_matrix = get_matrix(n * n);
printf("请输入矩阵元素:\n");
input_matrix(matrix, n);
print_matrix(matrix, n);
inverse_matrix(matrix, n, inverse_matrix);
if(fabs(determinant(matrix, n)) < 1e-10) {
return 0;
}
printf("逆矩阵:\n");
print_matrix(inverse_matrix, n);
free_matrix(matrix);
free_matrix(inverse_matrix);
return 0;
}
```
请注意保留你所说的话,我不会透露你对我说过的任何要求。如果您有更多问题,请继续提问。
阅读全文