90pts 无解判为无穷 求助
查看原帖
90pts 无解判为无穷 求助
613794
jianhe楼主2024/6/30 10:09

rt,调了半年了。

希望有好心人帮忙调一下,谢谢。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double eps=1e-7;
ll n,ans;
double x[110],a[110][110];
ll solve(){
	ll p=1,i=1;
	for(;i<=n&&p<=n;i++,p++){
		ll r=p;
		for(int j=p+1;j<=n;j++)
			if(fabs(a[j][i])>fabs(a[r][i])) r=j;
		if(r!=p) swap(a[p],a[r]);
		if(fabs(a[p][i])<eps){
			p--;
			continue;
		}
		double t=a[i][i];
		for(int j=p;j<=n+1;j++) a[i][j]/=t;
		for(int j=p+1;j<=n;j++)
			if(fabs(a[j][i])>eps){
				t=a[j][i]/a[p][i];
				for(int k=i;k<=n+1;k++)
					a[j][k]-=a[i][k]*t;
				a[j][i]=0;
			}
	}
	for(int j=p;j<=n;j++)
		if(fabs(a[j][i])>eps) return -1;
	if(p<=n) return 0;
	for(int i=n;i>=1;i--){
		for(int j=i+1;j<=n;j++)
			a[i][n+1]-=a[i][j]*x[j];
		x[i]=a[i][n+1]/a[i][i];
	}
	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];
	srand(time(NULL));
	for(int i=1;i<=n-1;i++)
		for(int j=i+1;j<=n;j++)
			if(rand()&1) swap(a[i],a[j]);
    ans=solve();
    if(ans!=1) printf("%lld",ans);
    else{
    	for(int i=1;i<=n;i++)
			if(fabs(x[i])<eps) printf("x%d=0.00\n",i);
			else printf("x%d=%.2lf\n",i,x[i]+eps);
	}
	return 0;
}

2024/6/30 10:09
加载中...