qx的博客

博客

a+b problem 题解

2024-01-31 23:40:19 By qx

先把一个单项式理解为:

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

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

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

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

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

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。