描述
随机生成任一方阵,输出其转置矩阵。
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//n阶行列式的值
double det(double* a, int N)
{
int i, j, m, n, s, t, k = 1;
double f = 1.0, c, x;
for (i = 0, j = 0; i < N && j < N; i++, j++) {
if (a[i * N + j] == 0) {
for (m = i + 1; m < N && a[m * N + j] == 0; m++)
if (m == N)
return 0;
else
for (n = j; n < N; n++) {
c = a[i * N + n];//a[i][n]
a[i * N + n] = a[m * N + n];//a[i][n]=a[m][n]
a[m * N + n] = c;//a[m][n]
}
k = -k;
}
for (s = N - 1; s > i; s--) {
x = a[s * N + j];//a[s][j]
for (t = j; t < N; t++)
a[s * N + t] -= a[i * N + t] * (x / a[i * N + j]);
}
}
for (i = 0; i < N; i++)//a[i][i]
f *= a[i * N + i];
return k * f;
}
int main()
{
double* arr;
srand((unsigned)time(NULL));
int n = rand()%3 + 1;
arr = (double*)malloc(sizeof(double)*n*n);
int i,j;
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
*(arr + i * n + j) = rand()%4 + 1;
printf("%g ",*(arr + i * n + j));
}
printf("\n");
}
if(n == 1)
printf("%g",*arr);
else{
double* a;
a = (double*)malloc(sizeof(double)*n*n);
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
int p = 0;
int x = 0;
double* temp;
temp = (double*)malloc(sizeof(double)*(n-1)*(n-1));
while(x < n){
if(x == i){x++;continue;}
int y = 0;
int q = 0;
while(y < n){
if(y == j){y++;continue;}
*(temp + p*(n-1) + q) = *(arr + x*n + y);
q++;
y++;
}
x++;
p++;
}
*(a + i*n + j) = det(temp,n-1) * (*(arr + i*n + j));
free(temp);
}
printf("\n");
}
for(i = 0;i < n;i++){
for(j = 0;j < n;j++)
printf("%g ",*(a + j*n + i));
printf("\n");
}
free(a);
}
free(arr);
return 0;
}
测试:
更多相关内容请参见