这是我写的: (多项式加法)编写一个程序实现两个多项式的加法运算,例如求2X^20-X^17+5X^9-7X^7+16X^5+10X^4+22X^2-15和2x^19+3x^17+15x^10+7x^7-10x^5+4x^4+13x^2-7,要求使用动态变量
不知为什么输入两个8项式时结果总多出一项东西
输入两个2项式却没问题。
代码有点长:先输入两个多项式->合并同类项-->按项系数的大小排序-》输出

#include <stdio.h>
#include <stdlib.h>
typedef struct{int a;int b;}ab;
main()
{
  int i,j,k=0,l=0,m,n,tem,tem2;
  ab*p,*r;
  printf("请分别输入你要计算的多项式的项数\n"); 
  scanf("%d%d",&m,&n);
  p=(ab*)malloc((m+n)*sizeof(ab));
  printf("请输入第一个多项式:\n");
  for(i=0;i<m;i++)
  scanf("%dx^%d",&p[i].a,&p[i].b);
  printf("请输入第二个多项式:\n");
  for(i=m;i<m+n;i++)
  scanf("%dx^%d",&p[i].a,&p[i].b);
  for(i=0;i<m+n-1;i++)
     for(j=i+1;j<m+n;j++)
      {
        if(p[i].b==p[j].b&&p[i].a!=0&&p[j].a!=0)
         {p[i].a+=p[j].a;p[j].a=0;l++;}
         }
  r=(ab*)malloc((m+n-l)*sizeof(ab));
   k=0;
   for(i=0;i<m+n;i++)
     {
       if(p[i].a!=0){r[k].a=p[i].a;r[k].b=p[i].b;k++;}
       }
   free(p);p=NULL;
   for(i=0;i<m+n-l-1;i++)
     for(j=i+1;j<m+n-l;j++)
      {
       if(r[i].b<r[j].b){tem=r[i].a;r[i].a=r[j].a;r[j].a=tem;
                          tem2=r[i].b;r[i].b=r[j].b;r[j].b=tem2;}                  
        }
     printf("结果如下:\n");
     if(r[0].a==-1)printf("-x^%d",r[0].b);
     else if(r[0].a==1)printf("x^%d",r[0].b);
     else if(r[0].a!=-1&&r[0].a!=1) printf("%dx^%d",r[0].a,r[0].b);
     for(i=1;i<m+n-l;i++)
      {
        if(r[i].a>0&&r[i].a!=1&&r[i].b!=0) printf("+%dx^%d",r[i].a,r[i].b);
       else if(r[i].a>0&&r[i].a!=1&&r[i].b==0) printf("+%d",r[i].a);
       else if(r[i].a==1&&r[i].b!=0)printf("+x^%d",r[i].b);
       else if(r[i].a==1&&r[i].b==0)printf("+1");
       else if(r[i].a<0&&r[i].a!=-1&&r[i].b!=0) printf("%dx^%d",r[i].a,r[i].b);
       else if(r[i].a<0&&r[i].a!=-1&&r[i].b==0) printf("%d",r[i].a);
       else if(r[i].a==-1&&r[i].b!=0)printf("-x^%d",r[i].b);
       else if(r[i].a==-1&&r[i].b==0)printf("-1");
       }
    free(r);r=NULL;
    printf("\n"); 
     system("pause");
    return 0;
}