**题目来源:中国大学MOOC-陈越、何钦铭-数据结构-2018春
作者: DS课程组
单位: 浙江大学**
问题描述:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
解答:这道题我写的时候思路很奇怪==,请勿模仿,用两个map分别存两个多项式{指数:系数}的对应信息,又用3个set,其中两个set分别存两个多项式的指数信息,用于之后从map中取系数进行运算,另一个set用于结果生成(因为set自动排好序了)。还是推荐采用开大小为1001数组进行实现,更为直接,我会把数组实现的代码再贴上来。
#include <iostream>
#include <map>
#include <set>
using namespace std;
map<int,int> ExpAndNumA,ExpAndNumB,result;
set<int> ExpA,ExpB,resultSet;
void input(map<int,int> &SomeoneMap,set<int> &SomeoneSet,int N)
{
for(int i=0; i<N; i++)
{
int num,exp;
cin>>num>>exp;
SomeoneMap[exp]=num;
SomeoneSet.insert(exp);
}
}
void add()
{
for(auto it=ExpA.begin(); it!=ExpA.end(); it++)
{
resultSet.insert(*it);
result[*it]=ExpAndNumA[*it];
}
for(auto it=ExpB.begin(); it!=ExpB.end(); it++)
{
if(result.count(*it)==0)
{
resultSet.insert(*it);
result[*it]=ExpAndNumB[*it];
}
else
result[*it]+=ExpAndNumB[*it];
}
}
void multi()
{
for(auto it=ExpA.begin(); it!=ExpA.end(); it++)
{
for(auto it2=ExpB.begin(); it2!=ExpB.end(); it2++)
{
int newExp=*it+*it2;
int newNum=ExpAndNumA[*it]*ExpAndNumB[*it2];
if(result.count(newExp)==0)
{
resultSet.insert(newExp);
result[newExp]=newNum;
}
else
result[newExp]+=newNum;
}
}
}
void output()
{
bool flag=0;
for(auto rit=resultSet.rbegin(); rit!=resultSet.rend(); rit++)
{
if(result[*rit]!=0)
{
flag=1;
if(rit==resultSet.rbegin())
{
cout<<result[*rit]<<" "<<*rit;
}
else
{
cout<<" "<<result[*rit]<<" "<<*rit;
}
}
}
if(!flag)
cout<<"0 0";
}
int main()
{
int N1,N2;
cin>>N1;
input(ExpAndNumA,ExpA,N1);
cin>>N2;
input(ExpAndNumB,ExpB,N2);
result.clear();
resultSet.clear();
multi();
output();
cout<<endl;
result.clear();
resultSet.clear();
add();
output();
return 0;
}