PAT(甲) 1009. Product of Polynomials (25)

1009. Product of Polynomials (25)

题目地址:1009. Product of Polynomials (25)
题目描述:

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


  • 输入格式
    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.

  • 输出格式
    For each test case you should output the product 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 up to 1 decimal place.


解题方法:
这里可以用一个结构首先存储A多项式的信息,然后接下来输入B,每输一B的一项,就计算他与A的乘积,并把结果保存到map里面去,其中key是指数,value是系数


易错点:
这里需要注意的一点就是,可能在合并同类项的时候,出现了系数抵消为0的情况,这样的话就需要在进行一次判断,把那些系数不为0的结果才输出。




程序:

#include <stdio.h>
#include <map>
using namespace std;

struct P
{
    int expon;
    double coef;
}A[10];

int main(int argc, char const *argv[])
{
    int k, expon, i;
    double coef;
    map <int, double> PolyNomial;   /* 以指数为键,系数为值 */
    scanf("%d", &k);
    for (i = 0; i < k; i++) /* i记录A有多少项 */
        scanf("%d %lf", &A[i].expon, &A[i].coef);
    scanf("%d", &k);
    for (int j = 0; j < k; j++)
    {   /* 每输入一个,就与原来的多项式进行一次乘法 */
        scanf("%d %lf", &expon, &coef);
        for (int n = 0; n < i; n++)
            PolyNomial[expon + A[n].expon] += coef * A[n].coef;
    }   
    int len = PolyNomial.size();
    map<int, double>:: reverse_iterator it;
    for (it = PolyNomial.rbegin(); it != PolyNomial.rend(); it++)
        if (it->second == 0)    /* 如果系数为0 */
            len--;
        printf("%d", len);
    for (it = PolyNomial.rbegin(); it != PolyNomial.rend(); it++)
        if (it->second != 0)    /* 打印结果 */
            printf(" %d %.1lf", it->first, it->second);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值