题目链接:https://www.patest.cn/contests/pat-a-practise/1002
原题如下:
This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 2 1.5 1 2.9 0 3.2
__________________________________________________________________________________________________________________________________________________
这道题我感觉就是一元多项式的加法,因此用了之前文章中的方法,集用两个链表分别存储两行元素,每次比较然后相加,可是有三个测试点超时了……代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct Node{ 5 struct Node *Next; 6 int expon; 7 float coef; 8 }PNode; 9 10 void Insert(PNode *P,PNode **PtrRear) 11 { 12 //printf("er"); 13 PNode *tmp=(PNode *)malloc(sizeof(struct Node)); 14 tmp->expon=P->expon;tmp->coef=P->coef;tmp->Next=NULL; 15 (*PtrRear)->Next=tmp; 16 *PtrRear=tmp; 17 //printf("sd"); 18 return ; 19 } 20 21 PNode * ReadP(int K) 22 { 23 int i,e; 24 float c; 25 PNode *P1=(PNode *)malloc(sizeof (struct Node)); P1->Next=NULL; 26 PNode *tmp=(PNode *)malloc(sizeof (struct Node));tmp->Next=NULL; 27 tmp=P1; 28 for (i=0;i<K;i++) 29 { 30 scanf("%d %f",&e, &c); 31 PNode *P=(PNode*)malloc(sizeof (struct Node)); 32 P->expon =e;P->coef=c;P->Next=NULL; 33 P1->Next=P; 34 P1=P; 35 } 36 tmp=tmp->Next; 37 38 return tmp; 39 } 40 41 int main() 42 { 43 int K1,K2,i; 44 PNode *rear,*front,*tmp; 45 rear=(PNode *)malloc(sizeof (struct Node));front=rear; 46 PNode *P1=(PNode *)malloc(sizeof (struct Node)); 47 PNode *P2=(PNode *)malloc(sizeof (struct Node)); 48 49 scanf("%d",&K1);P1=ReadP(K1); 50 scanf("%d",&K2);P2=ReadP(K2); //printf(" %d %.1lf %d %.1lf",P1->expon,P1->coef,P1->Next->expon,P1->Next->coef); printf(" %d %.1lf %d %.1lf ",P2->expon,P2->coef,P2->Next->expon,P2->Next->coef); 51 52 int cnt=0; 53 while (P1 && P2) 54 { 55 if (P1->expon>P2->expon) 56 { 57 Insert(P1,&rear); 58 P1=P1->Next; 59 cnt++; 60 } 61 else if (P1->expon<P2->expon) 62 { 63 Insert(P2,&rear); 64 P2=P2->Next; 65 cnt++; 66 } 67 else if (P1->expon==P2->expon) 68 { 69 if (P1->coef+P2->coef) 70 { 71 PNode *tmp=(PNode *)malloc(sizeof (struct Node)); 72 tmp->expon=P1->expon;tmp->coef=P1->coef+P2->coef; 73 tmp->Next=NULL; 74 Insert(tmp,&rear); 75 P1=P1->Next;P2=P2->Next; 76 cnt++; 77 } 78 } 79 } 80 while (P1){Insert(P1,&rear);P1=P1->Next;cnt++;} 81 while (P2){Insert(P2,&rear);P2=P2->Next;cnt++;} 82 83 int flag=0; 84 tmp=front; 85 front=front->Next; 86 while (front) 87 { 88 if (!flag) 89 {printf("%d %d %.1f",cnt,front->expon,front->coef);front=front->Next;flag=1;} 90 else 91 { 92 printf(" %d %.1f",front->expon,front->coef);front=front->Next; 93 } 94 } 95 free(tmp); 96 return 0; 97 }
希望哪位朋友能帮忙看下问题在哪……
在网上看了其他人的代码,真是简单精妙啊,直接开一个数组,指数即为数值下标,每个数组的值即为相应的每个指数对应系数的值,代码如下:
#include<stdio.h> #define MaxN 1001 int main() { int K,i,e; int line=2; int cnt=0; int Maxe=0; double Input[MaxN]={0}; double c; while (line) {scanf("%d",&K); for (i=0;i<K;i++) { scanf("%d %lf",&e,&c); Input[e]+=c; if (e>Maxe)Maxe=e; } line--; } for (i=Maxe;i>=0;i--) { if (Input[i]!=0)cnt++; } printf("%d",cnt); for (i=Maxe;i>=0;i--) { if (Input[i]!=0)printf(" %d %.1lf",i,Input[i]); } return 0; }