02-线性结构2 一元多项式的乘法与加法运算

下面展示一些 内联代码片

// 鄙人不才,花了一整天才写完。通过PAT那一刻涕泪交加,
特写博客纪念。代码或许冗余,仅供各位大佬们娱乐一下。
代码是从Dev直接复制粘贴过来的,排版可能不是那么的好看。
本人用数组写的,非链表实现。
有不足的地方望能海涵指正。
希望各位看官看完点个赞。
举手之劳,却是我今后继续创作的最大激励。谢谢!
#include <stdio.h>
#include <stdlib.h> 
#define ElementType int

typedef struct list List;
struct list{
 ElementType a,b;
};
List* Read();
List* Mutiply(List* A, List* B);
List* Add(List* A, List* B);
void Print(List* L);

int main(int argc, char *argv[]) {
 List* A,*B;
 A=Read();
 B=Read();
 Print(Mutiply(A,B));
 printf("\n");
 Print(Add(A,B));
 return 0;
}

//a为系数,b为指数,数组第零项.a储存元素个数
List* Read(){
 int n;
 scanf("%d",&n);
 List* A=(List*)malloc((n+1)*sizeof(List));
 A[0].a=n;
 A[0].b=1;
 int i;
 for(i=1;i<=n;i++) {
  scanf("%d",&A[i].a);
  scanf("%d",&A[i].b);
 } 
 return A;
}

void move(List* C, List L, int place){
 int i;
 for(i=C[0].a;i>=place;i--) C[i+1]=C[i];
 C[place]=L;
 C[0].a++;
}

void Check(List* C){
 int i,cnt=0;
 int n=C[0].a;
 for(i=1;i<=n;i++){
  if(C[i].a==0){
   cnt++;
   C[0].a--;
  }else C[i-cnt]=C[i];
 }
}

List* Mutiply(List* A, List* B){
 List* C=(List*)malloc((A[0].a*B[0].a+1)*sizeof(List));
 C[0].b=0;
 int i,j;//0为之前没有过,1为递降,2为递增。C[0].a为C多项式的个数,C[0].b为C多项式的增减状况及是否进入过第一次循环。 
 for(i=1;i<=A[0].a;i++){
  for(j=1;j<=B[0].a;j++){
   List L;
   L.a=A[i].a*B[j].a;
   L.b=A[i].b+B[j].b;
   if(C[0].b){ 
    if((L.b>C[C[0].a].b && C[0].b==2) || (L.b<C[C[0].a].b && C[0].b==1)) C[++C[0].a]=L;
    else{
     int i;
     for(i=1;i<=C[0].a;i++){
      if(C[0].b==1 && L.b>C[i].b){
       move(C,L,i);
       break;
      }
      else if(C[0].b==2 && L.b<C[i].b){
       move(C,L,i);
       break;
      }  
      if(C[i].b==L.b){
       C[i].a+=L.a;
       break;
      }
     }
    }
   } else C[j]=L;
  }
  if(!C[0].b){
   if(C[1].b<C[2].b) C[0].b=2;
   else C[0].b=1;
   C[0].a=B[0].a;
  } 
 }
 Check(C);
 return C;
}

List* Add(List* A, List* B){
 List* C=(List*)malloc((A[0].a+B[0].a+1)*sizeof(List));
 C[0].a=0;
 C[0].b=1;
 int iA,iB,iC;
 for(iA=1,iB=1,iC=1;iA!=A[0].a+1 && iB!=B[0].a+1;iC++){
  if(A[iA].b==B[iB].b) {
   C[iC].a=A[iA].a+B[iB].a;
   C[iC].b=A[iA].b;
   iA++;iB++;
  }
  else if(A[iA].b>B[iB].b) 
  {
   C[iC]=A[iA];
   iA++;
  }
  else {
   C[iC]=B[iB];
   iB++;
  }
 }
 if(A[0].a>B[0].a){
  int i;
  for(i=iA;i<=A[0].a;i++) C[iC++]=A[i];
 }
 else{
  int i;
  for(i=iB;i<=B[0].a;i++) C[iC++]=B[i];
 }
 C[0].a=iC-1;
 Check(C);
 
 return C;
}

void Print(List* L){
 int i;
 if(L[0].a==0){
  printf("0 0");
  return;
 }
 if(L[0].b==1){
  for(i=1;i<=L[0].a;i++){
   printf("%d %d",L[i].a,L[i].b);
   if(i!=L[0].a) printf(" ");
  }
 }else{
  for(i=L[0].a;i>=1;i++){
   printf("%d %d",L[i].a,L[i].b);
   if(i!=L[0].a) printf(" ");
  }
 }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值