A+B problem 题解

Posted on 2024-01-31 23:40  q(x)  阅读(2)  评论(0编辑  收藏  举报

先把一个单项式理解为:

符号,系数的绝对值,字母,指数。

为了方便操作,一口气读完整个字符串(数组),然后去扫描。

因为如果第一项为整数的话没有符号,判一判。

读入系数的绝对值像快读。

如果有 \(\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);
}