是金还是银

题目描述:是金还是银
代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;
#define Max 100
#define eps 1e-6

int b[Max];
int x[Max];//向量
int s[Max];//s[i]向量所在的位置


int rankB(double b[],int m)
{
	m--;
	int i;
	for(i=m;i>=0;i--)
		if(fabs(b[i])>eps) break;
	
	return i>0?i:0;
 }

int gauss(double a[][Max],double b[],int m)//求秩
{
	int js[Max],is;
	double d;
	double p;
	for(int i=0;i<m;i++) js[i]=i;
	
	for(int k=0;k<3;k++)
	{
		d=0.0;
		for(int i=k;i<3;i++)
		{
			for(int j=k;j<m;j++)
			{
				double t=fabs(a[i][j]);
				if(t>d)
				{
					d=t;is=i;js[k]=j;
				}
			}
		}
		if(fabs(d)< eps) 
		{
			int t;
			for(t=k;t<3;t++)
			{
				if(fabs(b[t])>eps) break;
			}
			if(t<3) 
			{
				b[k]=b[t];
				for(int i=k+1;i<3;i++)
					b[i]=0.0;
			}
			break;
		}
		else
		{
			if(js[k]!=k)
			{
				for(int i=0;i<3;i++)
				{
					p=a[i][k];a[i][k]=a[i][js[k]];a[i][js[k]]=p;
				}
			}
			if(is!=k)
			{
				for(int i=k;i<m;i++)
				{
					p=a[k][i];a[k][i]=a[is][i];a[is][i]=p;
				}
				p=b[k];b[k]=b[is];b[is]=p;
			}
		}
		d=a[k][k];
		for(int i=k;i<m;i++) a[k][i]=a[k][i]/d;
		b[k]=b[k]/d;
		for(int i=k+1;i<3;i++)
		{
			if(fabs(a[i][k])>eps)
			{
				for(int j=k+1;j<m;j++)
				{
					a[i][j]=a[i][j]-a[k][j]*a[i][k];
				}
				b[i]=b[i]-b[k]*a[i][k];
				a[i][k]=0;
			}
			
		}
		
	}
	
	
	int maxz;
	if(m<3)
		maxz=m;
	else maxz=3;
	while(maxz>=1&&fabs(a[maxz-1][maxz-1])<eps) maxz--;
	if(rankB(b,3)>maxz-1)
		return false;
	else
		return true;
}

int main()
{
	int n;
	double a[Max][Max];//系数矩阵
	double b[Max];
	int cnt=0;
	while(cin>>n)
	{
		cnt++;
		if(b==0) break;
		for(int i=0;i<n;i++)
		{
			scanf("%lf%lf%lf",&a[0][i],&a[1][i],&a[2][i]);
		}
		scanf("%lf%lf%lf",&b[0],&b[1],&b[2]);
		printf("Mixture %d\n",cnt);
		if(gauss(a,b,n))
			printf("Possible\n");
		else
			printf("Impossible\n");

	}
	return 0;
}