题目概述:
求解两个多项式之积
分析:
1.用map记录对应的项和系数
2.遍历mp1和mp2,使得他们每个项数之和的系数加上他们的系数之积,并将结果存入mp3中
3.忽略掉系数为0的项,求总项数
4.反向遍历,输出结果(忽略0项)
#include<bits/stdc++.h>
using namespace std;
map<int, double> mp1;
map<int, double> mp2;
map<int, double> mp3;
int main()
{
int k1, k2;
int a;
double b;
cin >> k1;
for(int i = 0; i < k1; i++)
{
cin >> a >> b;
mp1[a] = b;
}
cin >> k2;
for(int i = 0; i < k2; i++)
{
cin >> a >> b;
mp2[a] = b;
}
for(auto it1 = mp1.begin(); it1 != mp1.end(); it1++)
{
for(auto it2 = mp2.begin(); it2 != mp2.end(); it2++)
{
mp3[it1->first + it2->first] += it1->second * it2->second;
}
}
int cnt = 0;
for(auto it = mp3.begin(); it != mp3.end(); it++)
{
if(it->second != 0) cnt++;
}
cout << cnt;
for(auto it = mp3.rbegin(); it != mp3.rend(); it++)
{
if(it->second == 0) continue;
printf(" %d %.1f", it->first, it->second);
}
cout << endl;
return 0;
}
总结:
1.注意rbegin和rend用法
2.注意mp的第二项为double
2022.01.11
#include<bits/stdc++.h>
using namespace std;
// 记录最后结果
double res[2100];
// 结构体存储
struct node {
int exp;
double coe;
};
vector<node> v1, v2;
int main() {
for(int i = 0; i < 2; i++) {
int k;
cin >> k;
for(int j = 0; j < k; j++) {
int exp;
double coe;
cin >> exp >> coe;
if(i == 0) v1.push_back({exp, coe});
else v2.push_back({exp, coe});
}
}
// 两重循环找结果
for(int i = 0; i < v1.size(); i++)
for(int j = 0; j < v2.size(); j++) {
res[v1[i].exp + v2[j].exp] += v1[i].coe * v2[j].coe;
}
// 统计非零个数
int total = 0;
for(int i = 0; i < 2010; i++) {
if(res[i] != 0) total++;
}
cout << total;
// 从大到小输出指数 + 系数
for(int i = 2010; i >= 0; i--) {
if(res[i] != 0)
printf(" %d %.1f", i, res[i]);
}
return 0;
}