一元多項式的乘法與加法運算(20)
設計函數分別求兩個一元多項式的乘積與和。
輸入格式說明:
輸入分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 |
代碼(1)(普通的不嚴謹的方法,因爲沒說算式會有幾項):
#include <cstdio>
#include <cstring>
int a[1000000],b[1000000],c[1000000],d[1000000],vis[1000010];
int main (){
int n,m,flag,num,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d %d",&a[i],&b[i]);
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d %d",&c[i],&d[i]);
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
vis[b[i]+d[j]]+=a[i]*c[j];
flag=0,num=0;
for(i=1000000;i>=0;i--)
if(vis[i]!=0){
flag=1;
if(num==1)
printf(" %d %d",vis[i],i);
else if(num==0){
printf("%d %d",vis[i],i);
num=1;
}
}
if(flag==0)
printf("0 0");
printf("\n");
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
vis[b[i]]+=a[i];
for(i=1;i<=m;i++)
vis[d[i]]+=c[i];
flag=0,num=0;
for(i=1000000;i>=0;i--)
if(vis[i]!=0){
flag=1;
if(num==1)
printf(" %d %d",vis[i],i);
else if(num==0){
printf("%d %d",vis[i],i);
num=1;
}
}
if(flag==0)
printf("0 0");
printf("\n");
return 0;
}
代碼(2)(用STL做的比較合適):
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
struct node
{
int a,b;
}w;
deque<node>ans1,ans2,a,b;
bool cmp(node a,node b){
return a.b>b.b;
}
int main(){
int n,i,j,k,flag;
for(i=0;i<2;i++){
cin>>n;
while(n--){
cin>>w.a>>w.b;
if(!i)
a.push_back(w);
else {
b.push_back(w);
ans2.push_back(w);
}
}
}
for(i=0;i<a.size();i++){
for(j=0;j<b.size();j++){
w.a=a[i].a*b[j].a;
w.b=a[i].b+b[j].b;
flag=0;
for(k=0;k<ans1.size();k++){
if(ans1[k].b==w.b){
ans1[k].a+=w.a;
flag=1;
}
}
if(!flag)
ans1.push_back(w);
}
flag=0;
for(j=0;j<ans2.size();j++){
if(ans2[j].b==a[i].b){
ans2[j].a+=a[i].a;
flag=1;
}
}
if(!flag)
ans2.push_back(a[i]);
}
sort(ans1.begin(),ans1.end(),cmp);
sort(ans2.begin(),ans2.end(),cmp);
flag=0;
for(i=0;i<ans1.size();i++){
if(!flag){
if(ans1[i].a){
printf("%d %d",ans1[i].a,ans1[i].b);
flag=1;
}
}
else{
if(ans1[i].a)
printf(" %d %d",ans1[i].a,ans1[i].b);
}
}
if(!flag)
printf("0 0\n");
else
printf("\n");
flag=0;
for(i=0;i<ans2.size();i++){
if(!flag){
if(ans2[i].a){
printf("%d %d",ans2[i].a,ans2[i].b);
flag=1;
}
}
else{
if(ans2[i].a)
printf(" %d %d",ans2[i].a,ans2[i].b);
}
}
if(!flag)
printf("0 0\n");
else
printf("\n");
return 0;
}