#include <string>
#include "EquaType.h"
#include "DataType.h"
using namespace std;
equas normal(string sInfix)
{
string sSuffix;
sSuffix.clear();
stack<char>aChar;
int iL=sInfix.length(),iI=0;
while (iI<iL)
{
if ((sInfix.at(iI))=='x')
{
while (sInfix.at(iI)!=']')
{
sSuffix.append(1,sInfix.at(iI));
iI++;
}
sSuffix.append(1,']');
}
if ((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.'))
{
while ((iI<iL)&&((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.')))
{
sSuffix.append(1,sInfix.at(iI++));
}
iI--;
sSuffix.append(1,',');
}
if (sInfix.at(iI)=='(')
{
aChar.push('(');
}
if (sInfix.at(iI)==')')
{
while (aChar.top()!='(')
{
sSuffix.append(1,aChar.pop());
}
aChar.pop();
}
if ((sInfix.at(iI)=='-')&&((iI==0)||((!isdigit(sInfix.at(iI-1)))&&(sInfix.at(iI-1)!=']'))))
{
sSuffix.append(1,'_');
}
else if ((sInfix.at(iI)=='+')||(sInfix.at(iI)=='-')||(sInfix.at(iI)=='*')||(sInfix.at(iI)=='/'))
{
while (vs(sInfix.at(iI))<=vs(aChar.top()))
{
sSuffix.append(1,aChar.pop());
}
aChar.push(sInfix.at(iI));
}
iI++;
}
while (!aChar.empty())
{
sSuffix.append(1,aChar.pop());
}
iI=0;
iL=sSuffix.length();
stack <equas> aEquas;
while (iI<iL)
{
if (sSuffix.at(iI)=='x')
{
iI+=2;
int iNum=0;
while (isdigit(sSuffix.at(iI)))
{
iNum=iNum*10+sSuffix.at(iI)-'0';
iI++;
}
equas nT;
nums nE;
nE.irecord(1,1);
nT.set(iNum,nE);
aEquas.push(nT);
}
if (isdigit(sSuffix.at(iI)))
{
long iJ=0,iAt=iI,iT=1,iNum=0,iFlag=0;
nums nE;
while (sSuffix.at(iI)!=',')
{
if (isdigit(sSuffix.at(iI)))
{
if (iFlag==0)
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
}
else
{
iNum=iNum*10+sSuffix.at(iI++)-'0';
iJ++;
}
}
else if (sSuffix.at(iI)=='.')
{
iFlag=1;
iI++;
}
}
if (iAt>0)
{
if (sSuffix.at(iAt-1)=='_')
{
iNum=-iNum;
}
}
if (iJ>0)
{
for (iAt=1;iAt<=iJ;iAt++)
{
iT*=10;
}
}
nE.record(iNum,iT);
equas nT;
nT.set(0,nE);
aEquas.push(nT);
}
if (sSuffix.at(iI)=='+')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1+nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='-')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2-nT1;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='*')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT1*nT2;
aEquas.push(nT3);
}
if (sSuffix.at(iI)=='/')
{
equas nT1,nT2,nT3;
nT1=aEquas.pop();
nT2=aEquas.pop();
nT3=nT2/nT1;
aEquas.push(nT3);
}
iI++;
}
return aEquas.pop();
}
int main()
{
cin>>equas::iEquas;
int iI,iJ,iK,iH,iPnt;
string sInput;
equas aEquas[equas::iEquas],nT1,nT2;
for (iI=0;iI<equas::iEquas;iI++)
{
cin>>sInput;
iPnt=sInput.find('=');
nT1=normal(sInput.substr(0,iPnt));
nT2=normal(sInput.substr(iPnt+1,sInput.length()-iPnt-1));
for (iJ=1;iJ<=equas::iEquas;iJ++)
{
aEquas[iI].set(iJ,nT1.get(iJ)-nT2.get(iJ));
}
aEquas[iI].set(0,nT2.get(0)-nT1.get(0));
}
nums nD,aD[equas::iEquas],nT;
equas aVec,aTemp;
for (iI=0;iI<(equas::iEquas-1);iI++)
{
if (aEquas[iI].get(iI+1).return_Up()!=0)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
else
{
iH=0;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aEquas[iJ];
aEquas[iJ]=aEquas[iI];
aEquas[iI]=aTemp;
iH=1;
break;
}
}
if (iH==1)
{
nT=aEquas[iI].get(iI+1);
aVec=aEquas[iI]/nT;
for (iJ=iI+1;iJ<equas::iEquas;iJ++)
{
if (aEquas[iJ].get(iI+1).return_Up()!=0)
{
aTemp=aVec*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
}
}
}
for (iI=equas::iEquas-1;iI>=0;iI--)
{
aEquas[iI]=aEquas[iI]/aEquas[iI].get(iI+1);
for (iJ=iI-1;iJ>=0;iJ--)
{
aTemp=aEquas[iI]*aEquas[iJ].get(iI+1);
aEquas[iJ]=aEquas[iJ]-aTemp;
}
}
for (iJ=0;iJ<equas::iEquas;iJ++)
{
cout<<"x["<<iJ+1<<"]:";
aEquas[iJ].get(0).display();
cout<<endl;
}
}