• PAT 1009 Product of Polynomials


    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<iomanip>
    using namespace std;
    
    struct Node
    {
        int exp;
        double coe;
    };
    vector<Node> vRes;
    
    //将两个多项式相加,最后的结果保存在v1中。
    //即将两个有序链表merge在一起。
    void addPols(vector<Node> &v1,vector<Node> &v2)
    {
        /* 这段代码导致了段错误,因为product函数中会执行v2.clear();
        而v2此时又赋值给了v1,所以v1再访问的时候,就出现了段错误。
        但不是一直断错误,所以vector的clear函数并没有将内容置为空。
        if(v1.size() == 0)
        {
            v1 = v2;
            return;
        }
        */
        vector<Node>::iterator it1 = v1.begin();
        vector<Node>::iterator it2 = v2.begin();
        while(it1!=v1.end() && it2!=v2.end())
        {
            if(it1->exp < it2->exp)
            {
                v1.insert(it1,*it2);
                it2++;
            }
            else if(it1->exp > it2->exp)
                it1++;
            else if(it1->exp == it2->exp)
            {
                it1->coe += it2->coe;
                it1++;
                it2++;
            }
        }
        
        while( it2!=v2.end() )
        {
            v1.push_back(*it2);
            it2++;
        }
    }
    
    //两个多项式相乘.
    void product(vector<Node> &v1,vector<Node> &v2)
    {
        vector<Node> tmpPol;    
    
        for(vector<Node>::iterator it1=v1.begin(); it1!=v1.end(); it1++)
        {
            tmpPol.clear();//清空tmpPol中的节点。
            for(vector<Node>::iterator it2=v2.begin(); it2!=v2.end(); it2++)
            {
                Node tmpNode;
                tmpNode.exp = it1->exp + it2->exp;
                tmpNode.coe = (it1->coe)*(it2->coe);
                tmpPol.push_back(tmpNode);
            }
            addPols(vRes,tmpPol);
        }
    }
    
    
    //打印结果
    void printRes(vector<Node> &v)
    {
        vector<Node>::iterator it;
        //原来第一个test case一直过不了的原因是因为精度的问题。
        for (it = v.begin(); it != v.end(); ) {
            if (fabs(it->coe) <= 1e-10) //此时可以认为是0
            {
                it = v.erase(it);
            }
            else
                it++;
        }
        it = v.begin();
        cout<<v.size();
        while(it!=v.end())
        {
            cout<<" "<<it->exp<<" "<<fixed<<setprecision(1)<<it->coe;
            it++;
        }
        cout<<endl;
    }
    
    int main()
    {
        int k1,k2,i;
        vector<Node> v1,v2;//输入的两个多项式
        cin>>k1;
        for(i=0; i<k1; i++)
        {
            Node tmpNode;
            cin>>tmpNode.exp>>tmpNode.coe;
            v1.push_back(tmpNode);
        }
        cin>>k2;
        for(i=0; i<k2; i++)
        {
            Node tmpNode;
            cin>>tmpNode.exp>>tmpNode.coe;
            v2.push_back(tmpNode);
        }
        product(v1,v2);
        printRes(vRes);
        return 0;
    }
  • 相关阅读:
    php二维数组指定下标排序
    laravel使用auth管理后台amdin数据表
    laravel插件
    laravel中Horizon简单介绍适合于redis操作队列
    laravel5.5或laravel5.7版本自定义日志记录
    laravel使用"tymon/jwt-auth": "0.5.*"
    larval5.7安装jwt使用
    ubuntu ibus 输入法总在左下角不跟随光标的处理
    Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier
    30种mysql优化sql语句查询的方法<转>
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2797619.html
Copyright © 2020-2023  润新知