是金还是银
题目描述:
代码:
#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;
}