1002. A+B for Polynomials (25)

题目链接: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 Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample 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("\n%d %.1lf %d %.1lf",P1->expon,P1->coef,P1->Next->expon,P1->Next->coef); printf("\n%d %.1lf %d %.1lf\n",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;
}

 


posted @ 2016-12-31 11:25  变通无敌  阅读(191)  评论(0编辑  收藏  举报