一:题目
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
二:补充测试用例
测试点2:
2 1 2 1 0
2 1 2 -1 0
测试用力3:
2 -1000 1000 1000 0
2 1000 1000 -1000 0
测试用例4:
0
0 1 2 3
三:思路
思路:用map<int,int>进行 存储数据;在处理乘积的时候 一个系数 对应一个指数,
若指数相同 对系数进行累加
处理多项式和的运算同理
四:上码
/**
思路:用map<int,int>进行 存储数据;在处理乘积的时候 一个系数 对应一个指数,
若指数相同 对系数进行累加
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,M;
int arr1[1001],arr2[1001];
// map<int,int>m;
std::map<int, int, std::greater<int> > m,m2; //map默认的递增 ,这样改成递减的
//在创造map时,增加参数 **std::greater<int>**,就变成增加
map<int,int>::iterator t;
cin >> N;
for(int i = 0; i < 2 * N; i++){
int nums;
cin >> nums;
arr1[i] = nums;
}
cin >> M;
for(int i = 0; i < 2 * M; i++){
int nums;
cin >> nums;
arr2[i] = nums;
}
// 4 3 4 -5 2 6 1 -2 0
// 3 5 20 -7 4 3 1
//计算乘积
for(int i = 0; i < 2 * N - 1; i = i + 2){
for(int j = 0; j < 2 * M - 1; j = j + 2){
int temp1 = arr1[i + 1] + arr2[j + 1]; //指数相加
int temp2 = arr1[i] * arr2[j];//系数相乘
m[temp1] += temp2;//一个指数 对应系数(如果有指数相同的则累加)
}
}
int flag = 0;
if(N == 0 || M == 0){
cout << "0 0";
}else{
for(t = m.begin(); t != m.end(); t++){
if(flag == 0 && t->second != 0)//这里的t->second != 0 说的是系数不为0,一旦为0,就什么也不输出
cout << t->second << ' ' << t->first;
else if(t->second != 0){
cout << ' ' << t->second << ' ' << t->first;
}
flag = 1;
}
}
cout << endl;
//计算多项式的和
for(int i = 0; i < 2 * N - 1; i = i + 2){
m2[arr1[i+1]] = arr1[i];
}
for(int i = 0; i < 2 * M - 1; i = i + 2){
m2[arr2[i+1]] += arr2[i];//如果遇见指数相同的系数相加
}
int flag1 = 0;
int count = 0;
if(M == 0 && N == 0){
cout << "0 0";
}else{
for(t = m2.begin(); t != m2.end(); t++){
if(flag1 == 0 && t->second != 0)
cout << t->second << ' ' << t->first;
else if(t->second != 0){
cout << ' ' << t->second << ' ' << t->first;
}
flag1 = 1;
if(t->second == 0){
count++;
}
}
}
if(count == m2.size()){//测试点三
cout << "0 0";
}
}
//测试用例子 2(测试点2)
//2 1 2 1 0
//2 1 2 -1 0
//测试点3用例子
// 2 -1000 1000 1000 0
// 2 1000 1000 -1000 0
//测试点4的例子
// 0
// 0 1 2 3
五:知识速递(如果对于map的用法不了解的兄弟们,可以学一下啊)
最后加油Boy!!! 刷题源于热爱 , 顺便服务与以后的工作,学到老,刷到老!!!!!!!!!!