比如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 <stdio.h>
#include <math.h>
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=0row<nrow++)
{
printf("
Please input line %d:",row+1)
for(col=0col<ncol++)
scanf("%lf",&array[row][col])
}
}
void showarray(int n)
{
int row,col
printf("
A=")
for(row=0row<nrow++)
{
for(col=0col<ncol++)
printf("%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=0row<n-1row++)
{
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=0row<n-1row++)行加1?*/
continue/* 从array[row][row]==0知列也相应加1,开始处理第二列 */
switchtime++/* 每交换一次行,行列式符号变化1次,统计变化次数 */
for(col=0col<ncol++) /* 交换非零行到行列式顶部 */
{
stemp=array[row][col]
array[row][col]=array[nextrow][col]
array[nextrow][col]=stemp
}
}
for(nextrow=row+1nextrow<nnextrow++)
{ /* 类似高斯消去法,消第一行下各行第一列数值到零*/
temp=array[nextrow][row]/array[row][row]
for(col=0col<ncol++)
array[nextrow][col]+=-temp*array[row][col]/* 化行列式为上三角行列式形式 */
}
}
showarray(n)
for(row=0row<nrow++)
result*=array[row][row]
if(switchtime%2)
return -result
else
return result
}
>>a=magic(7)a =
303948 1101928
3847 7 9182729
46 6 817263537
5141625343645
131524334244 4
2123324143 312
22314049 21120
#include<stdio.h>main()
{ int i=2
while(1){
i++
if(i%2==1&&i%3==2&&i%4==3&&i%5==4&&i%6==5&&i%7==0)
break
}
printf("%d",i)
}
如图所示,望采纳。。。。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)