1002 A+B for Polynomials (25分)

题目

This time, you are supposed to find A+B where A and B are two polynomials.

Input Specification

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1​​ a​N1 N2 aN​2 … N​K aN​K
​​ where K is the number of nonzero terms in the polynomial, N​i​​ and a​N​i​​ (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10,0≤NK​<⋯<N​2​<N1≤1000.

Output Specification

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. 如果最后的结果没有非零项,那么要输出且只输出一个0。(我一开始输出了三个0,导致测试点6一直出错);
  2. 如果某两项的系数和为0,则不应输出。

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    double A[3000],B[3000],C[3000];
    int K1,K2;    				   //1≤K≤10
    int count=0;
    scanf("%d",&K1);		 //第一个多项式
    for(int i=0;i<2*K1;i++)
        scanf("%lf",&A[i]);
    scanf("%d",&K2);		 //第二个多项式
    for(int i=0;i<2*K2;i++)
        scanf("%lf",&B[i]);
    int a=0,b=0,c=0;
    while(a<2*K1&&b<2*K2)
    {
        if(A[a]>B[b])
        {
            C[c++]=A[a++];
            C[c++]=A[a++];
        }
        else if(A[a]<B[b])
        {
            C[c++]=B[b++];
            C[c++]=B[b++];
        }
        else
        {
            if(A[a+1]+B[b+1]!=0)
            {
                C[c++]=A[a];
                C[c++]=A[a+1]+B[b+1];
            }
            a=a+2;
            b=b+2;
        }
    }
    while(a<2*K1)
    {
        C[c++]=A[a++];
        C[c++]=A[a++];
    }
    while(b<2*K2)
    {
        C[c++]=B[b++];
        C[c++]=B[b++];
    }
    for(int i=1;i<c;i=i+2)				//防止截断尾数时出现-0.000的情况,其实不用考虑,因为如果为0直接跳过
    {											//而且测试点也没有考查
        if(C[i]<0&&fabs(C[i])<0.1)
            C[i]=0;
        else
            count++;					
    }
    printf("%d",count);
    if(count==0)
       return 0;
    else
    {
         printf(" ");
         for(int i=0;i<c;i=i+2)
        {
            if(C[i+1]!=0)			//浮点数最好用C[i+1]小于某个值
            {
                printf("%.0lf %.1lf",C[i],C[i+1]);
                if(i!=c-2)
                    printf(" ");
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值