#include<stdio.h>
#include<conio.h>
#include<math.h>
#define EPS 0.001
//int kk;
typedef struct polinom STR;

void inpol(STR*,char[]),outpol(STR*,char[]);
void copypol(STR*,STR*),normpol(STR*),delpol(STR*,STR*);
struct polinom { float a[40];
		 int n[40];
		 int k;
		} ;
void main(void)
{ int i;struct polinom pol[2],pold[2];
  clrscr();textcolor(10);gotoxy(10,1);textbackground(14);
  inpol(&pol[0],"First  ");
  normpol(&pol[0]);
  outpol(&pol[0],"Normal first  :");
  inpol(&pol[1],"Second ");
  normpol(&pol[1]);
  outpol(&pol[1],"Normal second :");
  copypol(&pol[0],&pold[0]);
  copypol(&pol[1],&pold[1]);
  delpol(&pold[0],&pold[1]);
  outpol(&pold[1],"Real polinom");
  outpol(&pold[0],"Ostatok");
  cputs("Press any key...");getch();
 }
void normpol(struct polinom *pol)
{int bufn,i,j,fn,k,kk,max,maxi,polk;
 float bufa,fa; polk=pol->k;
  if ((pol->k)<=1) return ;
  for(i=0;i<polk;i++)
  { for(j=i,max=pol->n[i],maxi=i;j<polk;j++)
     if (max<(pol->n[j])){maxi=j;max=pol->n[j];}
     bufn=pol->n[i];bufa=pol->a[i];
     pol->n[i]=pol->n[maxi];pol->a[i]=pol->a[maxi];
     pol->n[maxi]=bufn;pol->a[maxi]=bufa;
   }
   for(i=0;i<polk;i++)
    {while((pol->n[i])==(pol->n[i+1]))
	{pol->a[i]+=pol->a[i+1];
	 for(j=i+1;j<polk;j++) {pol->n[j]=pol->n[j+1];pol->a[j]=pol->a[j+1];}
	 polk--;pol->k=polk;
	 }
     }

   for(i=0;i<polk;i++)
    {if((fabs(pol->a[i]))<EPS)
	{polk--;pol->k=polk;
	 for(j=i;j<polk;j++)
	  {pol->n[j]=pol->n[j+1];
	   pol->a[j]=pol->a[j+1];
	  }
	 }
     }
}
void inpol(STR *pol,char ch[30])
{ int i,fn;float fa;
  textbackground(9);pol->k=0;
  cprintf("Input %s polinom until 20 elements,end [0] :\n\r",ch);
  for(i=0;i<20;i++)
  {scanf("%f",&fa);
   if (fa==0) break;
   scanf("%d",&fn);pol->k+=1;;pol->n[i]=fn;pol->a[i]=fa;
  }
}
void outpol(STR *pol,char ch[30])
{ int i,ii;
  textbackground(12);cprintf("%s\n\r",ch);textbackground(1);
  ii=pol->k;
  for(i=0;i<ii;i++)
  {cprintf("%+.3f*x^(%d)",pol->a[i],pol->n[i]);} cprintf("\b\n\r");
  textbackground(0);
}
void copypol(STR* pol1,STR* pol2)
{int i,polk;polk=pol1->k;
 for(i=0;i<polk;i++)
  {pol2->n[i]=pol1->n[i];pol2->a[i]=pol1->a[i];}
   pol2->k=pol1->k;
}
void delpol(pol1,pol2)
STR *pol1,*pol2;
{ STR *pold;
  int i,j,jj,fn;float fa;
  pold->k=0;
  for(i=0;(pol1->n[0])>=(pol2->n[0])&&(pol1->k)>0;i++)
  { pold->n[i]=(pol1->n[0])-(pol2->n[0]);
    pold->a[i]=(pol1->a[0])/(pol2->a[0]);
    pold->k+=1;
    for(j=(pol1->k),jj=0;jj<(pol2->k);j++,jj++)
     {fn=pold->n[i];fa=-1.0*(pold->a[i]);
      fn+=(pol2->n[jj]);
      pol1->n[j]=fn;
      fa*=(pol2->a[jj]);
      pol1->a[j]=fa;
      pol1->k+=1;
     }
    normpol(pol1);
    //outpol(pol1,"pol1");outpol(pold,"pold");getch();
  } copypol(pold,pol2);
}
