用C语言解决:求任意阶(n阶)矩阵的行列式
很遗憾,上面匿名的程序不正确。 比如n=2 输入: 3---7 2---1 得出错误结果。 而当输入n=3 0---1---3 3---0---2 5---2---0 时也会得出错误结果。 错误的原因有2: 1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除法,结果是取整整数,虽然他使用了类型强制转换,但结果显然不同,有误差而且有时候这个误差很大形成错误。 2 是算法有点问题。小可很欣赏匿名的算法思路,简洁明快。不过有相当缺陷,这在程序中注明。 下面的程序是在匿名的程序思路上改写的。考虑到数据类型和精确度问题,程序中...全部
很遗憾,上面匿名的程序不正确。 比如n=2 输入: 3---7 2---1 得出错误结果。 而当输入n=3 0---1---3 3---0---2 5---2---0 时也会得出错误结果。 错误的原因有2: 1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除法,结果是取整整数,虽然他使用了类型强制转换,但结果显然不同,有误差而且有时候这个误差很大形成错误。
2 是算法有点问题。小可很欣赏匿名的算法思路,简洁明快。不过有相当缺陷,这在程序中注明。 下面的程序是在匿名的程序思路上改写的。考虑到数据类型和精确度问题,程序中行列式数据使用double型。
由于tc和win-tc是16位编辑器,对float型和double型数据支持不好,所以程序是在32位编辑器Dev-c 下调试并通过的。 本题的一个完整的c程序如下,程序在Dev-c 下都调试通过,结果正确。
/* 用C语言解决:求任意阶(n阶)矩阵的行列式值 */ #include #include void getarray(int n); void showarray(int n); double getresult(int n); double array[10][10];/*设矩阵不超过10阶,可更改*/ int main() { int n; double result; printf("Please input the Array size n:"); scanf("%d",&n); getarray(n); showarray(n); result=getresult(n); printf("Result=%f",result); system("pause"); return 0; } void getarray(int n) { int row,col; for(row=0;row{ printf("Please input line %d:",row 1); for(col=0;colscanf("%lf",&array[row][col]); } } void showarray(int n) { int row,col; printf("A="); for(row=0;row{ for(col=0;colprintf(" %f",array[row][col]); printf(""); } } double getresult(int n) { double temp,result=1。
0; int switchtime=0,flag=0; int row,nextrow,col,stemp; for(row=0;row{ nextrow=row 1; if(array[row][row]==0)/* 开始处理第一列,如果行列式第一行第一个数为零,要交换行 */ { while(array[nextrow][row]==0) { nextrow ; /* 如果行列式第二行第一个数为零,行增加继续寻找非零数值的行 */ if(nextrow==n)/* 如果遍历完行列式行列式第一列元素都为零,退出while循环 */ { flag=1; break; } } if(flag==1) /* 退出while循环后回到for(row=0;rowcontinue; /* 从array[row][row]==0知列也相应加1,开始处理第二列 */ switchtime ; /* 每交换一次行,行列式符号变化1次,统计变化次数 */ for(col=0;col{ stemp=array[row][col]; array[row][col]=array[nextrow][col]; array[nextrow][col]=stemp; } } for(nextrow=row 1;nextrow{ /* 类似高斯消去法,消第一行下各行第一列数值到零*/ temp=array[nextrow][row]/array[row][row]; for(col=0;colarray[nextrow][col] =-temp*array[row][col];/* 化行列式为上三角行列式形式 */ } } showarray(n); for(row=0;rowresult*=array[row][row]; if(switchtime%2) return -result; else return result; }。
收起