UnAC100分 #12 #18WA 求条
查看原帖
UnAC100分 #12 #18WA 求条
1073879
Karl_Wan楼主2025/1/30 13:15
#include <iostream>
#include <iomanip>
#include <cmath> 
using namespace std;
double a[105][105];
const double eps=1e-7;
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cin>>a[i][j];}}
	for(int i=1;i<=n;i++)
	{
		//如果该行当前对角线为0,则找非0的行,加上那一行 
		if(fabs(a[i][i])<=eps)
		{
		int t=1;
		for(;t<=n;t++)
		{
			if(fabs(a[t][i])>eps)
			{
				//cout<<t<<'\n'; 
				break;
			}
		}
		if(t>n)//如果全0,那就跳过本列,去下一列进行消 
		{
			continue;
		} 
		for(int j=i;j<=n+1;j++)
		{
			a[i][j]+=a[t][j];
		}
		//cout<<"-----------swap\n";for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<' ';}cout<<'\n';}
		}
		//消这一行(消成1)
		double m=a[i][i];//除以本身等于1 
		for(int j=i;j<=n+1;j++)
		{
			a[i][j]/=m;
		}
		//cout<<"-----------消这一行(消成1)\n";for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<' ';}cout<<'\n';}
		//消其余行(消成0)
		for(int j=1;j<=n;j++)
		{
			if(j==i) continue;
			//加相反数等于0 
			double t=(-a[j][i]);
			bool flag1=1;
			for(int k=i;k<=n+1;k++)
			{
				a[j][k]+=
				a[i][k]*
				t;
				if(i==1&&flag1&&fabs(a[j][k])>eps)
				{
					if(j==n+1)
					{
						cout<<"No Solution";//无解 
						return 0;
					}
					else
					{
						flag1=0;
					}
				}
			}
			if(i==1&&flag1)
			{
				cout<<"No Solution\n";//无穷多解 
				return 0;
			}
			//cout<<"-----------消其余行(消成0)\n";for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<' ';}cout<<'\n';}
		} 
		//nextloop:;
		
	}
	//输出答案 
	for(int i=1;i<=n;i++)
	{
		cout<<fixed<<setprecision(2)<<a[i][n+1]<<'\n';
	}
	
	return 0;
}
2025/1/30 13:15
加载中...