A+B problem 题解
先把一个单项式理解为:
符号,系数的绝对值,字母,指数。
为了方便操作,一口气读完整个字符串(数组),然后去扫描。
因为如果第一项为整数的话没有符号,判一判。
读入系数的绝对值像快读。
如果有 \(\texttt{^}\) 这个符号,读一下之后的指数。
由于只有三个字母,所以可以复制粘贴,不用写冗余的 \(\texttt{for}\) 循环。代码如下:
inline void change(polygon &a,char *s1){
int l1=strlen(s1+1);
for(int i=1;i<=l1;){
int fl=1,x=0;
d w1=nw,w2=nw,w3=nw;
if(s1[i]=='+'||s1[i]=='-') fl=(s1[i]=='+'?1:-1),++i;
while(isdigit(s1[i])) x=x*10+(s1[i]-'0'),++i;
if(s1[i]=='x') w1.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w1.digit=w1.digit*10+(s1[i]-'0'),++i;
w1.digit=!w1.digit?w1.alpha=='x':w1.digit;
if(s1[i]=='y') w2.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w2.digit=w2.digit*10+(s1[i]-'0'),++i;
w2.digit=!w2.digit?w2.alpha=='y':w2.digit;
if(s1[i]=='z') w3.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w3.digit=w3.digit*10+(s1[i]-'0'),++i;
w3.digit=!w3.digit?w3.alpha=='z':w3.digit;
if(w1.alpha=='x'||w2.alpha=='y'||w3.alpha=='z')
a.x[{w1.digit,w2.digit,w3.digit}]+=fl*x;
else a.q+=fl*x;
}
}
然后考虑存储,约定一个结构体 \(str\) ,存储三个 \(\texttt{int}\) 变量 \(x,y,z\) 的质数。然后放进 \(\texttt{map}\) 里。映射项的系数。记得按照约定重载小于运算符。
定义一个多项式结构体,由一个 \(\texttt{map}\) 以及一个存储多项式常数的整型组成。
struct str{
int x,y,z;
bool operator < (const str b) const{
if(x+y+z!=b.x+b.y+b.z) return x+y+z>b.x+b.y+b.z;
if(x!=b.x) return x>b.x;
if(y!=b.y) return y>b.y;
return z>b.z;
}
};
struct polygon{ map<str,int> x; int q; }a,b,c;
表示 \(A,B,A+B.\)
合并同类项就扫一遍两个 \(\texttt{map}\) ,然后让新的 \(A+B\) 的每一项系数加上原来的系数。
inline void add(void){
for(auto it:a.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
for(auto it:b.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
c.q=a.q+b.q;
}
然后按要求输出,这一步多加小心。\(\texttt{cbh}\) 可是很毒瘤的。
inline void output(polygon x){
bool fl=0;
for(auto it:x.x){
if(!it.second) continue;
if(it.second>0&&fl) printf("+");
if(it.second==-1) printf("-");
if(it.second!=1&&it.second!=-1) printf("%d",it.second);
if(it.first.x==1) printf("x");
if(it.first.x>1) printf("x^%d",it.first.x);
if(it.first.y==1) printf("y");
if(it.first.y>1) printf("y^%d",it.first.y);
if(it.first.z==1) printf("z");
if(it.first.z>1) printf("z^%d",it.first.z);
fl=1;
}
if(x.q){
if(x.q>0&&fl) printf("+");
printf("%d",x.q);
fl=1;
}
if(!fl) printf("0");
return puts(""),void();
}
完整程式
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e7+10;
struct str{
int x,y,z;
bool operator < (const str b) const{
if(x+y+z!=b.x+b.y+b.z) return x+y+z>b.x+b.y+b.z;
if(x!=b.x) return x>b.x;
if(y!=b.y) return y>b.y;
return z>b.z;
}
};
struct polygon{ map<str,int> x; int q; }a,b,c;
struct d{ char alpha; int digit; };
const d nw={'w',0};
char s1[N],s2[N];
int pos;
inline void output(polygon x){
bool fl=0;
for(auto it:x.x){
if(!it.second) continue;
if(it.second>0&&fl) printf("+");
if(it.second!=1) printf("%d",it.second);
if(it.first.x==1) printf("x");
if(it.first.x>1) printf("x^%d",it.first.x);
if(it.first.y==1) printf("y");
if(it.first.y>1) printf("y^%d",it.first.y);
if(it.first.z==1) printf("z");
if(it.first.z>1) printf("z^%d",it.first.z);
fl=1;
}
if(x.q){
if(x.q>0&&fl) printf("+");
printf("%d",x.q);
fl=1;
}
if(!fl) printf("0");
return puts(""),void();
}
inline void change(polygon &a,char *s1){
int l1=strlen(s1+1);
for(int i=1;i<=l1;){
int fl=1,x=0;
d w1=nw,w2=nw,w3=nw;
if(s1[i]=='+'||s1[i]=='-') fl=(s1[i]=='+'?1:-1),++i;
while(isdigit(s1[i])) x=x*10+(s1[i]-'0'),++i;
if(s1[i]=='x') w1.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w1.digit=w1.digit*10+(s1[i]-'0'),++i;
w1.digit=!w1.digit?w1.alpha=='x':w1.digit;
if(s1[i]=='y') w2.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w2.digit=w2.digit*10+(s1[i]-'0'),++i;
w2.digit=!w2.digit?w2.alpha=='y':w2.digit;
if(s1[i]=='z') w3.alpha=s1[i],++i;
if(s1[i]=='^') ++i;
while(isdigit(s1[i])) w3.digit=w3.digit*10+(s1[i]-'0'),++i;
w3.digit=!w3.digit?w3.alpha=='z':w3.digit;
if(w1.alpha=='x'||w2.alpha=='y'||w3.alpha=='z')
a.x[{w1.digit,w2.digit,w3.digit}]+=fl*x;
else a.q+=fl*x;
}
}
inline void add(void){
for(auto it:a.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
for(auto it:b.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
c.q=a.q+b.q;
}
int main(){
cin>>(s1+1)>>(s2+1);
change(a,s1), change(b,s2);
add(), output(c);
}