zznu-oj-2134- 发红包!!!-【多项式加法,模拟题目】

时间:2021-10-26 21:27:43

2134: 发红包!!!

题目描述

给你两个最简多项式,请输出两个多项式相加后的结果。
给定的多项式的格式为ax^num1+bx^num2+...其中x前面的a,b代表系数num代表指数(次方数),输入按照多项式的指数从高到低,
输入的x项系数不包含前导0,系数为整数,系数的绝对值小于等于200,指数为正数且指数小于等于200。 输入 第一行一个case代表测试实例(case<=)
第二行一个字符串,代表第一个最简多项式。
第三行一个字符串,代表第二个最简多项式。 输出 一个字符串,代表相加后的最简多项式。

样例输入(新加了几组样例,基本涵盖了所有的后台样例)
1
2x^3+3x+5 4x^2-
2x
0 0
-9 8
922 -81
x^2 1x^55
2x^2+x+32 12
x^12 32
-x^3 x^2

样例输出 2x^+4x^+x+

大致思路:

  暴力模拟,先整体把字符串逐个处理成仅包含前缀系数a和幂的b ,然后存进ans[ 幂数 ] =前缀系数 的ans数组中,最后注意“-1”和“1”的前缀系数!

 #include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#include<set>
#define ll long long
using namespace std;
#define N 1000008
#define lson rt<<1
#define rson rt<<1|1
struct node{
ll a,b;
}p[N];
ll ans[N];
int cnt; //表示个数 char s1[N],s2[N];
void cul(char s[]){
int len=strlen(s);
for(int i=;i<len;){ //挖掘ax^b+
ll op=;
if(s[i]=='+'){
i++;
}
else if(s[i]=='-'){
op=-;
i++; } int a=,b=;
bool f=,g=; while(i<len&&s[i]!='+'&&s[i]!='-'){
if(s[i]=='x'){
i++;
f=;
continue;
} if(f==&&s[i]>=''&&s[i]<=''){
a=a*+s[i]-'';
}
else if(f==&&s[i]>=''&&s[i]<=''){ b=b*+s[i]-'';
g=;
}
i++;
}
a*=op;
if(f==&&a==)a=*op;
if(f==&&b==&&g==)b=; p[++cnt].a=a;
p[cnt].b=b;
} }
void debug(){ for(int i=;i<=cnt;i++)
printf("【【【 %lldx^%lld\n",p[i].a,p[i].b);
}
int main(){ int T;
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%s%s",s1,s2);
cnt=;
cul(s1);
cul(s2); // debug(); //调试函数
// printf("%lld %lld\n",p[1].a,p[1].b);
// printf("%lld %lld\n",p[2].a,p[2].b); memset(ans,,sizeof(ans)); for(int i=;i<=cnt;i++){
ans[p[i].b]+=p[i].a ;
} int f=;
for(int i=;i>=;i--){ //遍历次方数 if(ans[i]!=){
if(!f&&i==){ //对最后零项(特殊处理)
if(ans[]!=){
// if(ans[i]>0)cout<<"+";
printf("%lld",ans[i]);
f=;
}
break;
}
else if(i==){
if(ans[]!=){
if(ans[i]>)cout<<"+";
printf("%lld",ans[i]);
f=;
}
break;
} if(!f){
f=;
if(ans[i]!=&&ans[i]!=-)cout<<ans[i];
else if(ans[i]==-)cout<<"-"; if(i==)cout<<"x";
else if(i>)
cout<<"x^"<<i; }
else{
if(ans[i]>) cout<<"+"; if(ans[i]!=&&ans[i]!=-)cout<<ans[i];
else if(ans[i]==-)cout<<"-"; if(i==)cout<<"x";
else if(i>)
cout<<"x^"<<i;
}
}
}
if(f==)cout<<"";
cout<<endl;
} return ;
}

(面向后台数据编程)