zoukankan      html  css  js  c++  java
  • PAT 甲级 1009 Product of Polynomials (25)(25 分)(坑比较多,a可能很大,a也有可能是负数,回头再看看)

    1009 Product of Polynomials (25)(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 a~N2~ ... NK a~NK~, where K is the number of nonzero terms in the polynomial, Ni and a~Ni~ (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10, 0 <= NK < ... < N2 < N1 <=1000.

    Output Specification:

    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.

    Sample Input

    2 1 2.4 0 3.2
    2 2 1.5 1 0.5

    Sample Output

    3 3 3.6 2 6.0 1 1.6

    算两个多项式polynomials的乘积,挺简单的一题,一开始就5分,原来c数组开太小,结果仍只有20分,原来a(未知数的次数)可能是负数,
    乘积的未知数次数算出来是0的不要算进去
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<vector>
    #include<stack>
    #include<map>
    #define inf 0x3f3f3f3f
    using namespace std;
    struct node
    {
        int k;
        double num;
    };
    node a[105];
    node b[105];
    double c[200010];
    int s=0;
    int main()
    {
        int n1;
        while(cin>>n1)
        {
            s=0;//记录最后有多少组
            for(int i=1;i<=n1;i++)
            {
                cin>>a[i].k>>a[i].num;
            }
            int n2;
            cin>>n2;
            for(int i=1;i<=n2;i++)
            {
                cin>>b[i].k>>b[i].num;
            }
            memset(c,0,sizeof(c));
            for(int i=1;i<=n1;i++)
            {
                for(int j=1;j<=n2;j++)
                {
                    int k=a[i].k+b[j].k;
                    if(k>0&&c[k]==0)
                    {
                        s++;
                    }
                    else if(k<0&&c[-1*k+100005]==0)//万一是负数,特殊处理
                    {
                        s++;
                        k=-1*k+100005;
                    }
                    c[k]+=a[i].num*b[j].num;
                }
            }
            cout<<s;//输出组数
            for(int i=200005;i>=0;i--)
            {
                if(c[i]!=0&&i>100005)
                    printf(" %d %.1f",-1*(i-100005),c[i]);
                else if(c[i]!=0&&i<=100005)
                    printf(" %d %.1f",i,c[i]);
            }
            cout<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    CLR执行模式之程序集代码的执行
    CLR执行模式之托管代码程序集浅析
    第十章 使用变量的一般事项
    第九章伪代码编程过程 The PseudoCode Programming Process
    第八章防御式编程(代码大全读后)
    第七章实战高质量的子程序(代码大全第七章读后)
    一时看不明白大神的想法
    debain9 debian8 alpine 3.7 aliyun
    elk7
    ansible
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/9463813.html
Copyright © 2011-2022 走看看