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;
}