Programming
HOME
Programming
行列式を計算する
※同ディレクトリ内のmatrix.txtには、計算する行列が入っているものとする。
書式は、下のような感じ。
=======matrix.txt=======
4
1,2,3,4,
2,1,4,3,
3,4,2,1,
4,3,1,2,
======================
1行目は行列の大きさ。
2行目からは行列の成分。
列は,で区切り、行は\n(改行)で区切る。
#include <stdio.h>
#include <stdlib.h>
int calc_determinant(int size, int **m);
main(){
FILE *fp;
int **matrix;
int size;
int i,j;
int det,buf;
if ((fp = fopen("matrix.txt", "r")) == NULL) {
printf("Can not open the file.\n");
exit(1);
}
fscanf(fp,"%d",&size);
matrix=(int**)malloc(sizeof(int*)*size);
for(i=0; i<size; i++){
matrix[i] = (int*)malloc(sizeof(int)*size);
}
printf("size:%d\n",size);
for(i=0; i<size; i++){
for(j=0; j<size; j++){
fscanf(fp,"%d,",&buf);
matrix[i][j]=buf;
printf("%3d",matrix[i][j]);
}
printf("\n");
}
printf("-----------------------------------------------------\n");
det=calc_determinant(size,matrix);
printf("the determinant of the matrix:%d",det);
for (i=0; i<size; i++){
free(matrix[i]);
}
free(matrix);
return 0;
}
int calc_determinant(int size, int **m){
int sum,buf;
int pom;
int i,j,k,l;
int **mm;
sum=0;
if(size==2){
sum=m[0][0]*m[1][1]-m[1][0]*m[0][1];
return sum;
}
else{
mm=(int**)malloc(sizeof(int*)*(size-1));
for(i=0; i<(size-1); i++){
mm[i] = (int*)malloc(sizeof(int)*(size-1));
}
for(i=0; i<size; i++){
for(j=0; j<size-1; j++){
l=0;
for(k=0; k<size; k++){
if(i!=k){
mm[j][l]=m[j+1][k];
l++;
}
}
}
if(i%2==0){pom=1;}
else{pom=-1;}
buf=pom*m[0][i]*calc_determinant(size-1, mm);
sum+=buf;
}
}
return sum;
}