• 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("
    %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;
    }

  • 相关阅读:
    SPI传输协议笔记
    Linux power supply class
    linux ramdisk 参数问题
    Android事件处理过程分析
    PWM 参数计算
    6.828 lab3
    6.828 lab1
    i.MX53 上电启动过程
    linux jiffies的比较
    在arm板上安装Debian
  • 原文地址:https://www.cnblogs.com/wuxiaotianC/p/6238922.html
Copyright © 2020-2023  润新知