我太强了 @ 2019-08-23 00:27:41
大佬们快来看看qwq
#include<bits/stdc++.h>
using namespace std;
int n,flag;
double ans[105];
struct matrix
{
double z[105][105];
matrix()
{
memset(z,0,sizeof(z));
}
}a;
int gauss()
{
for(int i=1;i<=n;i++)
{
if(a.z[i][i]==0)
for(int j=i+1;j<=n;j++) if(a.z[j][i]!=0)
{
for(int k=1;k<=n+1;k++) swap(a.z[i][k],a.z[j][k]);
break;
}
if(!a.z[i][i])
{
for(int j=1;j<=n;j++) if(a.z[j][n+1]!=0) return -1;
return 0;
}
for(int j=i+1;j<=n;j++)
{
double mul=a.z[j][i]/a.z[i][i];
for(int k=1;k<=n+1;k++) a.z[j][k]-=a.z[i][k]*mul;
}
}
return 2;
}
void work()
{
ans[n]=a.z[n][n+1]/a.z[n][n];
for(int i=n-1;i>=1;i--)
{
for(int j=n;j>=i-1;j--) a.z[i][n+1]-=a.z[i][j]*ans[j];
ans[i]=a.z[i][n+1]/a.z[i][i];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++) scanf("%lf",&a.z[i][j]);
flag=gauss();
if(flag==0||flag==-1) printf("%d\n",flag);
else
{
work();
for(int i=1;i<=n;i++)
if(fabs(ans[i])>1e-8) printf("x%d=%.2lf\n",i,ans[i]);
else printf("x%d=0\n",i);
}
return 0;
}
by 未见堇开 @ 2019-08-23 11:32:21
@您太强了
在我看来,你是不撞NaN
墙不回头。
gauss()
中没有判定对角线的元素是否为0,很容易就会NaN
,导致特判出错。
by 我太强了 @ 2019-08-23 12:05:14
@Redspirit 啊那个啊,我早改了,但是还是没用。我一直80分,WA#4#8->WA#9#10->WA#8#10
这是最新代码
#include<bits/stdc++.h>
using namespace std;
int n,flag;
double ans[105];
struct matrix
{
double z[105][105];
matrix()
{
memset(z,0,sizeof(z));
}
}a;
void gauss()
{
for(int i=1;i<=n;i++)
{
int maxx=i;
if(fabs(a.z[i][i])<1e-8)
for(int j=i+1;j<=n;j++)
if(fabs(a.z[j][i])>fabs(a.z[i][i])) maxx=j;
if(maxx!=i) for(int k=1;k<=n+1;k++) swap(a.z[i][k],a.z[maxx][k]);
if(fabs(a.z[i][i])<1e-8) continue;
for(int j=i+1;j<=n;j++)
{
double mul=a.z[j][i]/a.z[i][i];
for(int k=1;k<=n+1;k++) a.z[j][k]-=a.z[i][k]*mul;
}
}
}
int check()
{
int none=0,inf=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=n+1;j++) if(fabs(a.z[i][j])<1e-8) cnt++;
if(cnt==n&&fabs(a.z[i][n+1])>1e-8) none=1;
if(cnt==n+1) inf=1;
}
if(none) return -1;
if(inf) return 0;
return 1;
}
void work()
{
ans[n]=a.z[n][n+1]/a.z[n][n];
for(int i=n-1;i>=1;i--)
{
for(int j=n;j>=i+1;j--) a.z[i][n+1]-=a.z[i][j]*ans[j];
ans[i]=a.z[i][n+1]/a.z[i][i];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++) scanf("%lf",&a.z[i][j]);
gauss();
flag=check();
if(flag==0||flag==-1) printf("%d\n",flag);
else
{
work();
for(int i=1;i<=n;i++)
if(fabs(ans[i])>1e-10) printf("x%d=%.2lf\n",i,ans[i]);
else printf("x%d=0\n",i);
}
return 0;
}