设计函数分别求两个一元多项式的乘积与和。
输入格式说明:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式说明:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 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 | 1 4 -1 0 2 2 |
3 | 2 -1000 1000 1000 0 2 1000 1000 -1000 0 | -1000000 2000 2000000 1000 -1000000 0 0 0 |
4 | 0 1 999 1000 | 0 0 999 1000 |
计算不是问题。用最笨的方法计算就行,只是调输出格式调的心累,最后索性各种判断条件往上套。
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct myPair{
int ratio;
int index;
};
int main(){
vector<myPair> vec1;
vector<myPair> vec2;
map<int,int> result_mul;
map<int,int> result_add;
int n,flag=0;
cin>>n;
while(n--){
myPair temp;
cin>>temp.ratio>>temp.index;
vec1.push_back(temp);
}
cin>>n;
while(n--){
myPair temp;
cin>>temp.ratio>>temp.index;
vec2.push_back(temp);
}
if(vec1.size() == 0 && vec2.size() != 0){
cout<<"0 0"<<endl;
if(vec2.size() == 1){
cout<<vec2[0].ratio<<" "<<vec2[0].index<<endl;
}else{
if(vec2[0].index != 0){
cout<<vec2[0].ratio<<" "<<vec2[0].index;
flag++;
}
for(int i = 1;i<vec2.size()-1;i++){
if(vec2[i].index != 0){
cout<<" "<<vec2[i].ratio<<" "<<vec2[i].index;
flag++;
}
}
if(flag && vec2[vec2.size()-1].index == 0){
cout<<endl;
}else if(flag == 0 && vec2[vec2.size()-1].index == 0){
cout<<"0 0"<<endl;
}else if(flag && vec2[vec2.size()-1].index != 0){
cout<<" "<<vec2[vec2.size()-1].ratio<<" "<<vec2[vec2.size()-1].index<<endl;
}else{
cout<<vec2[vec2.size()-1].ratio<<" "<<vec2[vec2.size()-1].index<<endl;
}
}
}else if(vec1.size() != 0 && vec2.size() == 0){
cout<<"0 0"<<endl;
if(vec1.size() == 1){
cout<<vec1[0].ratio<<" "<<vec1[0].index<<endl;
}else{
if(vec1[0].index != 0){
cout<<vec1[0].ratio<<" "<<vec1[0].index;
flag++;
}
for(int i = 1;i<vec1.size()-1;i++){
if(vec1[i].index != 0){
cout<<" "<<vec1[i].ratio<<" "<<vec1[i].index;
flag++;
}
}
if(flag && vec1[vec1.size()-1].index == 0){
cout<<endl;
}else if(flag == 0 && vec1[vec1.size()-1].index == 0){
cout<<"0 0"<<endl;
}else if(flag && vec1[vec1.size()-1].index != 0){
cout<<" "<<vec1[vec1.size()-1].ratio<<" "<<vec1[vec1.size()-1].index<<endl;
}else{
cout<<vec1[vec1.size()-1].ratio<<" "<<vec1[vec1.size()-1].index<<endl;
}
}
}else{
for(int i = 0;i<vec1.size();i++){
for(int j = 0;j<vec2.size();j++){
result_mul[vec1[i].index + vec2[j].index] += vec1[i].ratio * vec2[j].ratio;
}
}
int index1 = 0;
int index2 = 0;
while(index1 != vec1.size() && index2 != vec2.size()){
if(vec1[index1].index == vec2[index2].index){
result_add[vec1[index1].index] += vec1[index1].ratio + vec2[index2].ratio;
index1++;
index2++;
}else if(vec1[index1].index > vec2[index2].index){
result_add[vec1[index1].index] += vec1[index1].ratio;
index1++;
}else{
result_add[vec2[index2].index] += vec2[index2].ratio;
index2++;
}
}
while(index1 != vec1.size()){
result_add[vec1[index1].index] += vec1[index1].ratio;
index1++;
}
while(index2 != vec2.size()){
result_add[vec2[index2].index] += vec2[index2].ratio;
index2++;
}
map<int,int>::iterator iter1 = result_mul.end();
iter1--;
map<int,int>::iterator iter2 = result_add.end();
iter2--;
int count = 0;
if(iter1->second != 0){
cout<<iter1->second<<" "<<iter1->first;
count++;
}
iter1--;
while(iter1 != result_mul.begin()){
if(iter1->second != 0){
cout<<" "<<iter1->second<<" "<<iter1->first;
count++;
}
iter1--;
}
if(count && iter1->second == 0){
cout<<endl;
}else if(count == 0 && iter1->second == 0){
cout<<"0 0"<<endl;
}else if(count && iter1->second != 0){
cout<<" "<<iter1->second<<" "<<iter1->first<<endl;
}else{
cout<<iter1->second<<" "<<iter1->first<<endl;
}
count = 0;
if(iter2->second != 0){
cout<<iter2->second<<" "<<iter2->first;
count++;
}
iter2--;
while(iter2 != result_add.begin()){
if(iter2->second != 0){
cout<<" "<<iter2->second<<" "<<iter2->first;
count++;
}
iter2--;
}
if(count && iter2->second == 0){
cout<<endl;
}else if(count == 0 && iter2->second == 0){
cout<<"0 0"<<endl;
}else if(count && iter2->second != 0){
cout<<" "<<iter2->second<<" "<<iter2->first<<endl;
}else{
cout<<iter2->second<<" "<<iter2->first<<endl;
}
}
return 0;
}