3-04. 一元多项式的乘法与加法运算(20)

由于题中数据量不是很大 想到 类似“散列 查找”的算法 将指数 映射到一维数组的下标 而数组的值为 系数。

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

#define Size 1000000// 1000*1000
int Poly_1[Size+1], Poly_2[Size+1], Added[Size+1], Mul[Size+1];// added mul 分别存储 加结果 乘结果 后打印

struct Node
{
        int C;//系数
        int E;//指数
};

int main()
{
        vector<Node>V;
        Node num;

        memset( Poly_1, 0, sizeof( Poly_1) );
        memset( Poly_2, 0, sizeof( Poly_2 ));
        memset( Added, 0, sizeof( Added ) );
        memset( Mul, 0, sizeof(Mul) );

        int N;
        cin>>N;
        for( int i=0; i<N; i++ ){
                cin>>num.C>>num.E;
                Added[num.E]=Poly_1[num.E]=num.C;
                V.push_back(num);
        }
        cin>>N;
        for( int i=0; i<N; i++ ){
                cin>>num.C>>num.E;
                Poly_2[num.E]=num.C;
                Added[num.E]+=num.C;
                for( int i=0; i<V.size(); i++ )// 将每次的输入依次相乘后保存到 Mul 中
                            Mul[num.E + V[i].E ]+=num.C*V[i].C;
        }
        bool flag=true;// 检测 相加 相乘 后的 值是否 为 0    默认 为0
        bool first = true;
        for( int i=Size; i>=0; i-- )
        {
                if( Mul[i]!=0 ){
                        flag = false;
                    if( first ){
                            first = false;
                        cout<<Mul[i]<<" "<<i;
                    }
                    else
                        cout<<" "<<Mul[i]<<" "<<i;
                }
        }
        if( flag )
            cout<<0<<" "<<0;
        cout<<endl;
        flag = true;
        first = true;
        for( int i=Size; i>=0; i-- )
        {
                if( Added[i]!=0 ){
                        flag = false;
                    if( first ){
                            first = false;
                        cout<<Added[i]<<" "<<i;
                    }
                    else
                        cout<<" "<<Added[i]<<" "<<i;
                }
        }
        if( flag )
            cout<<0<<" "<<0;
        cout<<endl;
        return  0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值