设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
很快就出来了!
#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
struct sz{
int a;//系数
int b;//次
};
int main(){
sz m1[1005],m2[1005],m3[1000],m4[1000];
int a1[1005],a2[1005];
int m,n;
map<int,int> s1,s2;
cin >> n;
for(int i=0;i<n;i++){
cin>>m1[i].a>>m1[i].b;
s1[m1[i].b]+=m1[i].a;
}
cin >> m;
for(int i=0;i<m;i++){
cin >> m2[i].a;
cin >> m2[i].b;
s1[m2[i].b]+=m2[i].a;
for(int j=0;j<n;j++){
s2[m2[i].b+m1[j].b]+=m2[i].a*m1[j].a;//次数对应系数
}
}
int flag=0;
int kun=0;
for(int i=2001;i>=-2001;i--){
if(s2[i]!=0){
if(!flag){
printf("%d %d",s2[i],i);
flag=1;
}
else{
printf(" %d %d",s2[i],i);
}
kun=1;
}
}
if(kun==0){
printf("0 0");
}
printf("\n");
kun=0;
flag =0;
for(int i=2001;i>=-2001;i--){
if(s1[i]!=0){
if(!flag){
printf("%d %d",s1[i],i);
flag=1;
}
else{
printf(" %d %d",s1[i],i);
}
kun=1;
}
}
if(kun==0){
printf("0 0");
}
}
这个是在网上找的相关测试点的图