#include<fstream>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define FOR(i,b,e) for(int i=(b);i<=(e);i++)
#define FORE(i,b,e) for(int i=(b);i>=(e);i--)
#define maxnum 503
double n[2*maxnum][maxnum];
int v[maxnum];
double y[maxnum*2];
double *pn[2*maxnum];
int main()
{
#ifdef DEBUG_
ifstream fin("G:/1.txt");
#define cin fin
#endif
int M,N;
memset(v,0,sizeof(v));
cin>>N>>M;
int flag=0;
FOR(i,0,M-1){
pn[i]=*(n+i);
FOR(j,0,N-1)
cin>>n[i][j];
cin>>y[i];
}
int x=0;
for(x=0;x<N;x++){
if(fabs(pn[j][x])<=1e-6){
FOR(j,x+1,M-1)
if(fabs(pn[x][x])>1e-6){
swap(pn[x],pn[j]);
swap(y[x],y[j]);
break;
}
}
if(fabs(pn[x][x])<=1e-6)
break;
FOR(j,x+1,M-1){
double factor = pn[j][x]/pn[x][x];
FOR(k,0,N-1){
pn[j][k]-=pn[x][k]*factor;
}
y[j]-=y[x]*factor;
}
}
if(x<N){
cout<<"Many solutions"<<endl;
return 0;
}
FOR(i,x,M-1)
if(y[i]>1e-6){
cout<<"No solutions"<<endl;
return 0;
}
FORE(i,N-1,0){
v[i]=(y[i]/pn[i][i]+0.5);
for(int j=i-1;j>=0;j--){
y[j]-=y[i]*(pn[j][i]/pn[i][i]);
pn[j][i]=0;
}
}
FOR(i,0,N-1)
cout<<v[i]<<endl;
return 0;
}
两个地方的精度问题
1:判断是否为零
2:double转int时,比如1.999会变成1,要先加0.5再转
注:后来发现了一个bug,swap的时候忘了把交换y数组,居然也AC了,interesting