蒟蒻求助
查看原帖
蒟蒻求助
1227596
LosTcrab楼主2024/7/12 16:10

sub1第三个点代码判为无数解了 求助



//P2455 SCOI2006 线性方程组


#include<bits/stdc++.h>
#define int long long
using namespace std;

const double N=1e-6;//开最小值 

int n;

double a[110][110];//因为存在小数 所以开double 

int gauss(int n,int m){
	
	int r=0;//看现在消到第几行 充当指针 
	
	for(int k=0;k<n;k++){//k是主元 
		
		int piv=r;
		
		for(int i=r;i<n;i++)
			
			if(fabs(a[i][k])>fabs(a[piv][k]))
				
				piv=i;
				
			if(fabs(a[piv][k])<N)
				
				continue;
				
			for(int j=k;j<=m;j++)
			
				swap(a[r][j],a[piv][j]);
				
			for(int j=m;j>=k;j--)
			
				a[r][j]/=a[r][k];//第k项系数消为1 递减消除 如果正着消除 会有误差 
				
			for(int i=r+1;i<n;i++)
				
				if(fabs(a[i][k])>=N)//当系数不为零时消除 
				
					for(int j=m;j>=k;j--)//倒着消除为好 
					
						a[i][j]-=a[i][k]*a[r][j];//把第k项所有系数消为0 
						
			r++;
			
		}
		
		if(r<n){//判断有解或者是无数解 
			
			for(int i=0;i<n;i++){//枚举每一行 找到系数全为零的一行 
				
				bool flag=0;
				
				for(int j=0;j<m;j++)
					
					if(fabs(a[i][j])>=N)
						
						flag=1;
				if(flag)
					
					continue;//如果有系数不为零则跳过 
					
				if(fabs(a[i][m])>=N)
				
					return -1;//如果系数全为零 且结果不为零 则是无解 
				
				else
					
					 return 0;//否则为无数解 
			}
		}
		
		for(int j=n-1;j>=0;j--)//否则为精确解 代数解方程即可 
			
			for(int i=j-1;i>=0;i--)
				
				a[i][m]-=a[j][m]*a[i][j];
				
		return 1;//返回有精确解 
	}

signed main(){
	
		cin>>n;
		
		for(int i=0;i<n;i++)
		
			for(int j=0;j<=n;j++)
			
				cin>>a[i][j];
				
		int t=gauss(n,n);
		
		if(t<=0)
			
			return cout<<t<<endl,0;//如果没有精确解 直接输出t 
			
		for(int i=0;i<n;i++)
		
			printf("x%lld=%.2lf\n",i+1,a[i][n]);//否则按要求输出精确解 
			
		return 0;
}
2024/7/12 16:10
加载中...