注意事项:
- 数据类型是double,别写成int。
- 开始的索引设置为1,而不是0。
- 适当增加代码长度,从而减少失误。例如:
这样写确实很聪明:
for(int j=n+1;j>=c;j--)a[t][j]/=a[t][c];
但这么写更稳妥(备份一下):
double divisor = a[t][c];
for(int j=c;j<=n+1;j++)a[t][j]/=divisor;
以下是完整代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=120;
int n;
double a[N][N];
const double k=1e-6;
void out()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
printf("%8.2f",a[i][j]);
}
cout<<'\n';
}
cout<<'\n';
}
int guass()
{
int c,r;
for(c=1,r=1;c<=n;c++)
{
//find the maximum
int t=r;
for(int i=r;i<=n;i++)
{
if(abs(a[t][c])<abs(a[i][c]))t=i;
}
if(abs(a[t][c])<k)continue;
// divide
double divisor = a[t][c];
for(int j=c;j<=n+1;j++)a[t][j]/=divisor;
// swap
for(int j=1;j<=n+1;j++)swap(a[r][j],a[t][j]);
//reduce
for(int i=r+1;i<=n;i++)
{
double multiple=a[i][c];
for(int j=c;j<=n+1;j++)a[i][j]-=a[r][j]*multiple;
}
r++;
}
if(r<n+1)
{
for(int i=r;i<=n;i++)
{
if(abs(a[i][n+1])>k)return 0;
}
return 2;
}
else
//resolve
{
for(int i=n;i>=2;i--)
{
double solution=a[i][n+1];
int position=i;
for(int y=i-1;y>=1;y--)
{
a[y][n+1]-=a[y][position]*solution;
}
}
}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)cin>>a[i][j];
}
int t=guass();
if(t==0)puts("No solution");
else if(t==2)puts("Infinite group solutions");
else
{
for(int i=1;i<=n;i++)
{
if(abs(a[i][n+1])<k)a[i][n+1]=0;
printf("%.2lf\n",a[i][n+1]);
}
}
return 0;
}