行列式求值
时间限制(普通/Java) :
10000 MS/ 30000 MS 运行内存限制 : 65536 KByte
总提交 : 510 测试通过 : 105
总提交 : 510 测试通过 : 105
比赛描述
求 N 阶方阵对应的行列式值。
输入
输入数据包含多组测试案例。每组测试案例由N(0<N≤10)开头,N表示方阵阶数,后续N行每行包含N个实数。
输出
对于每个测试用例,行列式值打印在单独一行上,保留两位小数。
样例输入
1
1
2
1 1.2
3 -3.4
样例输出
1.00
-7.00
题目来源
南京邮电大学计算机学院首届ACM程序设计大赛(2009)
#include <iostream>
#include <cassert>
#include <iomanip>
using namespace std;
void swap(double &a,double &b){
double temp;
temp = a;
a = b;
b = temp;
}
int main(void){
int N=0,i=0,j=0,k=0;
double det=0,l=0;
double a[10][10]={0.0};
cout<<setprecision(2); //输出保留两位小数
cout<<fixed<<showpoint;
while(cin>>N){
assert(N<=10);
det = 1;
for(i=0;i<N;++i){
for(j=0;j<N;++j){
cin>>a[i][j];
}
}
for(i=0;i<N-1;++i){ //一第i行为基准,下面所有行的前i列全部清零
if(a[i][i] == 0){ //都一个元素为0,找一行更他换
for(j=i+1;j<N;++j){
if(a[j][i])
break;
}
if(j==N){ //找不到不为0的行,行列式为0
det = 0;
break; // 以前错了 南邮OJ没检测出来
}else{ //找到就互换
for(k=i;k<N;++k){
swap(a[i][k],a[j][k]);
}
det = -det; // 以前错了 南邮OJ没检测出来
}
}
for(j=i+1;j<N;++j){
l = a[j][i]/a[i][i];
a[j][i] = 0;
for(k=i+1;k<N;++k){
a[j][k] -= a[i][k]*l;
}
}
// for(int p1 = 0; p1 < N; p1++){
// for(int p2 = 0; p2 < N; p2++){
// cout << a[p1][p2] << " ";
// }
// cout << endl;
// }
}
for(i=0;i<N;++i){
det *= a[i][i];
}
cout<<det<<endl;
}
}