爆刷PAT(甲级)——之【1002】 A+B for Polynomials (25)——多项式和,C++

艰难的英语单词:(哈哈哈哈哈,顺便复习英语了!)

  polynomial    英 [ˌpɒlɪ'nəʊmɪəl]     多项式 n.

  exponents     英 [ɪks'pəʊnənts]     指数 n.

  coefficients      英 [kəʊɪ'fɪʃənts]     系数 n.

题意: 给出两个多项式, 输出多项式相加的结果。

     多项式输入的格式是,K(项数),ai(次数),bi(系数),。。。。,an,bn

     输入两个多项式。K是整数,次数ai是整数并且自大而小,系数是浮点数。

难点:一直WA,一直WA。 很绝望。出现了以及自己没考虑到很多问题。最后终于AC。。。

     1、整型和浮点型没看仔细

     2、并不需要自行排序

     3、输出格式是,次数大的在前面

     4、相加结果导致系数为0的时候,这一项就舍去不要输出了。。。项数也要减一的

     5、如果最后结果是0项,末尾是不能有空格的

     6、最后一直没有AC,百思不得其解,不知道错哪了,结果。。。是Debug用的printf没有注释掉。。。极其愚蠢。。。

     7、写的代码超级啰嗦,我看了别人的代码,就30行  ╥﹏╥

Code:  我的弱智代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
#define inf 50
#define loop(x,y,z) for(x=y;x<z;x++)

struct Node
{
    double rank;
    double value;
    Node(double r,double v):rank(r),value(v)
    {

    }
    bool operator> (const Node& j)const//系数小的在前面
    {
        return rank>j.rank;
    }
};
vector<Node>n1;
vector<Node>n2;
vector<Node>ans1;
vector<Node>ans2;

int main()
{
    n1.clear();
    n2.clear();
    ans1.clear();
    ans2.clear();

    int num1=0,num2=0;
    int i,j;

    scanf("%d",&num1);
    loop(i,0,num1)
    {
        double a,b;
        scanf("%lf%lf",&a,&b);
        n1.push_back(Node(a,b));
    }
    scanf("%d",&num2);
    loop(i,0,num2)
    {
        double a,b;
        scanf("%lf%lf",&a,&b);
        n2.push_back(Node(a,b));
    }

    i=j=0;//开始计算结果
    while(i<num1&&j<num2)
    {
        if(n1[i]>n2[j])
        {
            ans1.push_back(n1[i]);
            //printf("debug : %.1f %.1f\n",n1[i].rank,n1[i].value);
            i++;
        }
        else if(n2[j]>n1[i])
        {
            ans1.push_back(n2[j]);
            j++;
        }
        else
        {
            ans1.push_back(Node(n1[i].rank,n1[i].value+n2[j].value));
            i++;
            j++;
        }
    }
    //防止有最大次数项未保存记入
    loop(i,i,num1)ans1.push_back(n1[i]);
    loop(j,j,num2)ans1.push_back(n2[j]);

    int sum=ans1.size();
    loop(i,0,sum)
        if(ans1[i].value!=0)
            ans2.push_back(ans1[i]);

    sum=ans2.size();
    if(sum==0)
        printf("%d\n",sum);
    else
    {
        printf("%d",sum);
        i=0;
        loop(i,0,sum)
            printf(" %d %.1f",(int)ans2[i].rank,ans2[i].value);
        printf("\n");
    }
    return 0;
}

在网上瞅见了小姐姐的代码,反省之后,重写如下代码,整洁不少。。。。

这种思路就是用数组来存储系数,ans[i]就表示 i 次幂的项系数是多少。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 1009
#define loop(x,y,z) for(x=y;x<z;x++)

int main()
{
    int i,j,a,n,sum=0;
    double b;
    double ans[inf];
    memset(ans,0,sizeof ans);
    loop(i,0,2)
    {
        scanf("%d",&n);
        loop(j,0,n)
        {
            scanf("%d%lf",&a,&b);
            ans[a]+=b;
        }
    }
    loop(i,0,inf)
        if(ans[i]!=0.0)sum++;
    printf("%d",sum);
    for(i=inf-1;i>=0;i--)
        if(ans[i]!=0)
            printf(" %d %.1f",i,ans[i]);
    printf("\n");
    return 0;
}

以下是小姐姐的代码,自博客:https://blog.csdn.net/liuchuo/article/details/51985915

更加明白自己的愚蠢    ╥﹏╥

优秀代码如下:(转载)

设立c数组,长度为指数的最大值,c[i] = j表示指数i的系数为j,接收a和b输入的同时将对应指数的系数加入到c中,累计c中所有非零系数的个数,然后从前往后输出所有系数不为0的指数和系数~

#include <iostream>
using namespace std;
int main() {
    float c[1001] = {0};
    int m, n, t;
    float num;
    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf("%d%f", &t, &num);
        c[t] += num;
    }
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d%f", &t, &num);
        c[t] += num;
    }
    int cnt = 0;
    for (int i = 0; i < 1001; i++) {
        if (c[i] != 0) cnt++;
    }
    printf("%d", cnt);
    for (int i = 1000; i >= 0; i--) {
        if (c[i] != 0.0)
            printf(" %d %.1f", i, c[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hide_in_Code/article/details/81433902
今日推荐