wyf_sinon @ 2024-01-04 19:30:35
pts80+hack2WA 求助
其中会输出-0???
#include<bits/stdc++.h>
using namespace std;
#define DB double
const int N=105;
DB a[N][N],b[N];
DB eps=1e-7;
int n;
void ct()//方便调试
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
cout<<b[i];
puts("");
}
return ;
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
bool flag = true;
for(int i=1;i<=n;i++) // 解出xi并消去剩余xi的系数
{
bool f = false;
for(int j=i;j<=n;j++)
{
if(fabs(a[j][i])>eps) //找到一个xi系数不为0的方程
{
for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
swap(b[i],b[j]);
f=true;
}
}
if(f) flag=false; //xi多解
for(int j=1;j<=n;j++)
{
if(i==j) continue;
DB rate=a[j][i]/a[i][i];
for(int k=i;k<=n;k++)
a[j][k]-=a[i][k]*rate;
b[j]-=b[i]*rate;
}
}
for(int i=1;i<=n;i++)
{
if(fabs(a[i][i])<eps&&fabs(b[i])>eps)
{
puts("-1"); //无解
exit(0);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(fabs(a[i][j])>eps)
{
printf("0"); //多元即多解
exit(0);
}
}
}
if(flag)
{
printf("0");
exit(0);
}
for(int i=1;i<=n;i++)
printf("x%d=%.2f\n", i , b[i]/a[i][i] );
return 0;
}
by wyf_sinon @ 2024-01-04 19:33:09
上面改了一点结果变成60了?
by wyf_sinon @ 2024-01-04 19:35:26
pts80代码
#include<bits/stdc++.h>
using namespace std;
#define DB double
const int N=105;
DB a[N][N],b[N];
DB eps=1e-7;
int n;
void ct()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
cout<<b[i];
puts("");
}
return ;
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&b[i]);
}
for(int i=1;i<=n;i++) // 解出xi并消去剩余xi的系数
{
bool f = false;
for(int j=i;j<=n;j++)
{
if(fabs(a[j][i])>eps) //找到一个xi系数不为0的方程
{
for(int k=1;k<=n;k++) swap(a[i][k],a[j][k]);
swap(b[i],b[j]);
f=true;
}
}
if(!f)
{
printf("0");
exit(0);
}
for(int j=1;j<=n;j++)
{
if(i==j) continue;
DB rate=a[j][i]/a[i][i];
for(int k=i;k<=n;k++)
a[j][k]-=a[i][k]*rate;
b[j]-=b[i]*rate;
}
}
for(int i=1;i<=n;i++)
{
if(fabs(a[i][i])<eps&&fabs(b[i])>eps)
{
puts("-1");
exit(0);
}
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(fabs(a[i][j])>eps)
{
printf("0");
exit(0);
}
}
}
for(int i=1;i<=n;i++)
printf("x%d=%.2f\n", i , b[i]/a[i][i] );
return 0;
}
by Y_QWQ_Y @ 2024-02-10 21:00:33
@wyf_sinon 因为 double 把 0 算作负数,应该判断是否为 -0,强行转化成 0。
by wyf_sinon @ 2024-02-19 08:42:20
原来是这样吗(吃惊