[PAT解题报告] A+B for Polynomials

题目输入的是两个多项式,求的是两个多项式的和。
多项式使用非0项的系数和次数来表示的,并且是按降幂输入的。预先给出了非0项的个数(很小,不超过10)。
例如
2 1 2.4 0 3.2   表示2.4x + 3.2, 并且知道次数小于1000,输出也按同样格式输出,注意只输出非0项。
这个题类似于两个有序list的合并,因为多项式的加法无非就是合并同类项而已。
我们做题可以选择最不容易出错的方法,对于本题,因为次数不超过1000,我们用数组表示某个次数项对应的系数再方便不过了,而且数组比链表容易写,出错的可能性低。关键还是数据范围,次数才1000,如果次数达到109,尽管只有10项,我们无法用数组存放了——因为数组下标没法开那么大。
几个注意点:
(1)数组使用全局的——这样没出现的系数都自动是0了,并且全局的数组不在堆栈空间里。
(2)数组开大一点没关系……
(3)注意系数是实数,判断实数是否为0一般不用x == 0  而用fabs(x) <= eps (eps一般是1e-8, 1e-10),好在本题对精度要求并不高。
代码:
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>

using namespace std;

const double eps = 1.e-8;

double a[1024],b[1024];

int main() {
int n;
    for (scanf("%d",&n);n;--n) {
        int x;
        scanf("%d",&x);
        scanf("%lf",a + x);
    }
    for (scanf("%d",&n);n;--n) {
        int x;
        scanf("%d",&x);
        scanf("%lf",b + x);
    }
    int num = 0;
    for (int i = 1000; i >= 0; --i) {
        a[i] += b[i];
        if (fabs(a[i]) >= eps) {
            ++num;
        }
    }
    printf("%d",num);
    for (int i = 1000; i >= 0; --i) {
        if (fabs(a[i]) >= eps) {
            printf(" %d %.1lf",i,a[i]);
        }
    }
    puts("");
    return 0;
}    



原题链接: http://www.patest.cn/contests/pat-a-practise/1002
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务