7-2 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
这道题应该不需要数据结构就能做出来的,但我好像不行,每行的第一个数,代表多项式有几个,我用了四个数组,前两个用来存输入的两行数,数组c用来存乘法后的多项式,d当然是相加后的多项式,然后又分别给数组排序(本来想用函数,把排序重复的代码减少,但好像忘了太多知识了,先不搞了),把相加后系数为0的排除,第一次并没有考虑0多项式,然后程序只是过了两个案例,后来又加了判断0多项式,结果还是过了两个案例,就很烦,百度了一个,下面是copy的代码,下面是我的代码(大佬发现错误可以评论帮我改正),太过于繁琐,很久没做题了,用了结构体,代码量缩短了一倍。做了两个小时,十分钟看懂了,也没有想象中的难8,数组足够大,指数是系数所在的位置,逆序读出来,还曾记得在大一打新生赛的时候,(if else for循环)试遍所有的题,一片红,要改变以前的风格了。:)
百度代码
#include <iostream>
using namespace std;
struct play{
int ex;
int co;
}play[1005];
int main(){
int n,m,a[2005]={0},b[1005]={0};
cin>>n;
for(int i=0;i<n;i++){
cin>>play[i].co>>play[i].ex;
b[play[i].ex]+=play[i].co;
}
int tem1,tem2;
cin>>m;
for(int i=0;i<m;i++){
cin>>tem1>>tem2;
b[tem2]+=tem1;
for(int j=0;j<n;j++){
a[tem2+play[j].ex]+=(tem1*play[j].co);
}
}
int flag=0,is=1;
for(int i=2000;i>=0;i--){
if(a[i]!=0){
if(!is){
cout<<" "<<a[i]<<" "<<i;
}
if(is){
cout<<a[i]<<" "<<i;
is=0;
}
flag=1;
}
}
if(flag==0){
cout<<"0 0";
}
cout<<endl;
//加法
flag=0,is=1;
for(int i=1000;i>=0;i--){
if(b[i]!=0){
if(!is){
cout<<" "<<b[i]<<" "<<i;
}
if(is){
cout<<b[i]<<" "<<i;
is=0;
}
flag=1;
}
}
if(flag==0)
cout<<"0 0";
cout<<endl;
return 0;
}
我的代码
#include<iostream>
using namespace std;
#define N 10000
int main(){
int n,m;
int a[N],b[N],c[N],d[N];
cin>>n;
for(int i=1;i<=2*n;i++){
cin>>a[i];
}
cin>>m;
for(int i=1;i<=2*m;i++){
cin>>b[i];
}
//乘法
int o=1,flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i]==0)
flag=1;
if(b[i]==0)
flag=1;
c[o]=a[2*i-1]*b[2*j-1];
c[o+1]=a[2*i]+b[2*j];
o=o+2;
}
}
//乘法排序
o=o-1;
int num;
for(int i=2;i<o;i++){
for(int j=i+2;j<=o;j++){
if(c[j]>c[i]){
num=c[i];
c[i]=c[j];
c[j]=num;
num=c[i-1];
c[i-1]=c[j-1];
c[j-1]=num;
}
if(c[j]==c[i]){
c[j]=0;
c[i-1]=c[j-1]+c[i-1];
if(c[i-1]==0)
c[i]=0;
c[j-1]=0;
}
j++;
}
i++;
}
o=o-1;
while(c[o]==0){
o=o-2;
}
o=o+1;
if(flag==1){
cout<<"0 0"<<endl;
}
else{
for(int i=1;i<o;i++){
cout<<c[i]<<" ";
}
cout<<c[o]<<endl;
}
//加法排序
o=1;
for(int i=1;i<=n*2;i++){
d[o]=a[i];
o++;
}
for(int i=1;i<=m*2;i++){
d[o]=b[i];
o++;
}
o=o-1;
for(int i=2;i<o;i++){
for(int j=i+2;j<=o;j++){
if(d[j]>d[i]){
num=d[i];
d[i]=d[j];
d[j]=num;
num=d[i-1];
d[i-1]=d[j-1];
d[j-1]=num;
}
if(d[j]==d[i]){
d[j]=0;
d[i-1]=d[j-1]+d[i-1];
if(d[i-1]==0)
d[i]=0;
d[j-1]=0;
}
j++;
}
i++;
}
o=o-1;
while(d[o]==0){
o=o-2;
}
o=o+1;
for(int i=1;i<o;i++){
cout<<d[i]<<" ";
}
cout<<d[o];
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 时间海!
评论