高斯消元第一题,虽然坑了很多次,但是还是很好的基础题。
用double做就好了,小心高斯消元爆double类型
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
#define DB double
using namespace std;
int n;
DB a[110][110];
DB find_[110];
void Input()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
}
void Solve()
{
int i,j,ii;
for(i=1;i<=n;i++)
{
if(a[i][i]==0.0)
{
for(ii=i+1;ii<=n;ii++)
if(a[ii][i]!=0.0)
{
for(j=1;j<=n+1;j++)
swap(a[ii][j],a[i][j]);
break;
}
}
for(int ii=i+1;ii<=n;ii++)
{
DB r;
r=a[ii][i]/a[i][i];
for(int j=1;j<=n+1;j++)
{
a[ii][j]=a[ii][j]-a[i][j]*r;
}
}
}
for(int i=1;i<=n;i++) find_[i]=0.0;
/*
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%.0lf ",a[i][j]);
}
printf("%.0lf\n",a[i][n+1]);
}
*/
for(i=n;i>=1;i--)
{
DB s=a[i][n+1]; DB p=0;
for(j=n;j>=i+1;j--)
p+=a[i][j]*find_[j];
find_[i]=(s-p)/a[i][i];
}
}
void Output()
{
for(int i=1;i<n;i++)
printf("%.0lf ",find_[i]+1e-6);
printf("%.0lf\n",find_[n]+1e-6);
}
int main()
{
Input();
Solve();
Output();
return 0;
}