南邮 OJ 1035 行列式求值




行列式求值

时间限制(普通/Java) :  10000 MS/ 30000 MS          运行内存限制 : 65536 KByte
总提交 : 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;
	}
}


你可能感兴趣的:(ACM,南邮OJ,行列式求值)