方程式の解法...
私のコードは動作しますが、なぜでしょうか?
#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;
}