为什么四元以上线性方程组会无法输出
  • 板块学术版
  • 楼主InfSauf
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/4/27 17:38
  • 上次更新2023/10/28 02:48:06
查看原帖
为什么四元以上线性方程组会无法输出
420985
InfSauf楼主2022/4/27 17:38
#include <iostream>
using namespace std;
double a[1000][1000]= {0},result=1; //10阶以上行列式要对a数组修改大小
/*int det (int size) {
	int i,j,k,t;
	//int size;
	//cout<<"请输入行列式的阶数"<<endl;
	//cin>>size;
	//cout<<size<<"阶行列式"<<endl;
	for(i=0; i<size; i++)  for(j=0; j<size; j++)   cin>>a[i][j];
	for(i=0; i<size-1; i++) {
		while(a[i][i]==0) { //while里边防止除数分母0
			for(j=i+1; j<size; j++)    if(a[j][i]!=0||j==size-1)     break;
			for(k=i; k<size; k++)     {
				t=a[i][k];
				a[i][k]=a[j][k];
				a[j][k]=-t;
			}
			if(j==size-1)   i++;
			if(i==size-1)    break;
		}
		for(k=i+1; k<size; k++)   for(j=size-1; j>i-1; j--)   a[k][j]-=a[i][j]/a[i][i]*a[k][i];
	}
	//cout<<"整理后的行列式"<<endl;
	for(i=0; i<size; i++)  for(j=0; j<size; j++)  {
			if(j==0)    cout<<endl;
			//cout<<a[i][j]<<" ";
	}
	for(i=0; i<size; i++)  result*=a[i][i];
	cout<<endl<<"result is "<<((int)result==0?'\0':result)<<endl;
}*/
double a1[1000][1000]={0},b[1000]={0},dj[1000][1000]={0},dj_re[1000]={0},x[1000];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cin>>a1[i][j];
		}
		cin>>b[i];
	}
	int time=0;
det:
	//time++;
	result=1;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(time==i||j==0){
				dj[i][0]=b[i];
				//cout<<dj[i][j]<<" ";
			}
			else{
				dj[i][j]=a1[i][j];
				//cout<<dj[i][j]<<" ";
			}
		}
		//cout<<endl;
	}
   //以上死循环位置
	int t;
   
	for(int i=0; i<n-1; i++) {
		while(dj[i][i]==0) { //while里边防止除数分母0
			for(int j=i+1; j<n; j++){
				if(dj[j][i]!=0||j==n-1)break;
				for(int k=i; k<n; k++){
					t=dj[i][k];
					dj[i][k]=dj[j][k];
					dj[j][k]=-t;
				}
				if(j==n-1)   i++;
			}
			if(i==n-1)    break;
			//!!
		}
		for(int k=i+1; k<n; k++){
			for(int j=n-1; j>i-1; j--){
				dj[k][j]-=dj[i][j]/dj[i][i]*dj[k][i];
				//cout<<dj[i][j]<<" ";
			}
			//cout<<endl;
		}
	}
	for(int i=0; i<n; i++){
		result*=dj[i][i];
		//cout<<dj[i][i]<<" ";	
	}
	dj_re[time]=result;
	//cout<<dj_re[time]<<endl;
	//cout<<"["<<result<<"]"<<dj_re[time];
	time++;
	//cout<<time<<" ";
	if(time<n)goto det;
	//[系数行列式]
	double D1=1;
	int zn=0;
	for(int i=0; i<n-1; i++) {
		while(a1[i][i]==0) { //while里边防止除数分母0
			for(int j=i+1; j<n; j++){
				if(a1[j][i]!=0||j==n-1)break;
				for(int k=i; k<n; k++){
					t=a1[i][k];
					a1[i][k]=a1[j][k];
					a1[j][k]=-t;
				}
				if(j==n-1)i++;
			}
			if(i==n-1)break;
		}
		for(int k=i+1; k<n; k++)   for(int j=n-1; j>i-1; j--)   a1[k][j]-=a1[i][j]/a1[i][i]*a1[k][i];
	}
	for(int i=0;i<n;i++){
		if(a1[n-1][i]==0)zn+=1;
	}
	if(zn==n&&b[n-1]!=0){
		puts("inconsistent");
		exit(0);
	}
	else if(zn==n&&b[n-1]==0){
		puts("infvariable");
		exit(0);
	} 
	for(int i=0; i<n; i++){
		D1*=a1[i][i];
		//cout<<D1<<" ";
	}
	//cout<<endl;
	if(D1==0)cout<<"ERROR";
	else{
		for(int i=0;i<n;i++){
			//cout<<dj_re[i]<<" ";
			printf("%.3lf ",dj_re[i]/D1);
			//cout<<(dj_re[i]/D1)<<" ";
		}
	}
	cout<<endl;
	for(int i=0;i<n;i++){
		cout<<(int)dj_re[i]<<" ";
	}
	//cout<<endl;
	cout<<(int)D1;
	//det(n);
}
2022/4/27 17:38
加载中...