BuringStraw

BuringStraw

高斯消去法 ボード

方程式の解法...

私のコードは動作しますが、なぜでしょうか?

#include<bits/stdc++.h>
#define fo(i,j,k) for(int i=j;i<=k;++i)
using namespace std;

const int MAXN=105;
int n;

struct 行列{
	行列(int 行,int 列){
		h=行,l=列;
		memset(v,0,sizeof(v));	
	}
	
	行列(){
		memset(v,0,sizeof(v));			
	}
	
	void resize(int 行,int 列){
		h=行,l=列;
		memset(v,0,sizeof(v));	
	}
	
	
	void cleanForPow(void){
		memset(v,0,sizeof(v));
		int p=min(h,l);
		for(int i=1;i<=p;++i){
			v[i][i]=1;
		}
	}
	
	friend 行列 operator *(行列 a,行列 b){
		行列 c(a.h,b.l);
		if(a.l!=b.h)return c;
		
		for(int i=1;i<=a.h;++i){
			for(int j=1;j<=b.l;++j){
				long long s=0;
				for(int k=1;k<=a.l;++k){
					s=s+(a.v[i][k]*b.v[k][j]);
				}
				c.v[i][j]=s;
			}
		}
		return c;
	}
	
	friend 行列 operator +(行列 a,行列 b){
		int=max(a.h,b.h);
		int=max(a.l,b.l);
		行列 c(行,列);
		fo(i,1,行){
			fo(j,1,列){
				c.v[i][j]=a.v[i][j]+b.v[i][j];
			}
		}
	}
	
	行列 pow(int k){
		行列 res=*this;
		行列 ret(h,l);
		ret.cleanForPow();
		while(k){
			if(k&1){
				ret=ret*res;
			}
			res=res*res;
			k>>=1;
		}
		return ret;
	}
	
	void setV(long long t[MAXN][MAXN]){
		for(int i=1;i<=h;++i){
			for(int j=1;j<=l;++j){
				v[i][j]=t[i][j];
			}
		}
	}
	
	void print(void){
		fo(i,1,h){
			fo(j,1,l){
				cout<<v[i][j]<<' ';
			}
			cout<<'\n';
		}
	}
	
	void gsxy(void){
		for(int i=1;i<=n;++i){
			int mark=0;
			double tmp=0;
			for(int j=i;j<=n;++j){
				if(fabs(v[j][i])>tmp){
					mark=j;
					tmp=fabs(v[j][i]);
				}
			}
			for(int j=i;j<=n+1;j++){
				swap(v[i][j],v[mark][j]);
			}
			for(int j=1;j<=n;++j){
				if(i==j)continue;
				double rate=v[j][i]/v[i][i];
				for(int k=i;k<=n+1;++k){
					v[j][k]-=v[i][k]*rate;
				}
			}
		}
	}
	
	double v[MAXN][MAXN];
	int h,l;
};

int main(void){
	cin>>n;
	行列 a(n,n+1);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n+1;++j){
			cin>>a.v[i][j];
		}
	}
	a.gsxy();
	
	for(int i=1;i<=n;++i){
		if(fabs(a.v[i][n+1]/a.v[i][i]<=1e-8))printf("0 ");
		else printf("%0.lf ",a.v[i][n+1]/a.v[i][i]);
	}
	return 0;
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。