二元多项式

二元多项式

Time Limit: 1000MS  Memory Limit: 65536KB
Problem Description
 

给你多个二元多项式和一个操作符,让你输出操作符操作这些二元多项式之后的结果。

Input
 

首先输入二元多项式的个数n和操作符号(‘+’,‘*’);

后面n行输入每一个多项式。

多组输入,当n=0的时候结束输入。

(n<5,二元多项式的长度小于1000,二元多项式都是由x,y,^,数字,’+’组成的)

Output
 

输出操作之后的结果。

(输出的顺序按照:x^2>x>xy^2>xy>y^2>y>常数)

Example Input
2 +
3x+4y^2+3xy+6x^10y^2+1
2x+6y
0
Example Output
6x^10y^2+5x+3xy+4y^2+6y+1
Hint

没错,好的代码是需要细细品味哒qwq,小金橘的代码

这其实是一个大模拟,期中的坑点也是非常多,需要很细心,考虑全面

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<vector>
using namespace std;

const int maxn=5000;
char arr[maxn];

int getnum(int &i){
    int val=0;
    while(isdigit(arr[i])){
        val*=10;
        val+=arr[i]-'0';
        i++;
    }
    return val;
}

int getclo(int &str,char c){
    int ret=0;
    if(arr[str]==c){
        str++;
        if(arr[str]=='^'){
            str++;
            ret=getnum(str);
        }
        else
           ret=1;
    }
    return ret;
}

void itout(int m,char c){
    if(m!=0){
        if(m==1)
            printf("%c",c);
        else
            printf("%c^%d",c,m);
    }
}

struct item{
    int x,y;
    int v;
    item(int _v=0,int _x=0,int _y=0){
        v=_v,x=_x,y=_y;
    }
    void init(int &str){
        v=getnum(str);
        x=getclo(str,'x');
        y=getclo(str,'y');
        if(v==0 && (x!=0||y!=0)) v=1;
    }
    void out(){
        printf(v==1 && (x||y)?"":"%d",v);
        itout(x,'x');
        itout(y,'y');
    }
    bool operator < (const item &k) const{
        if(x!=k.x)
            return x>k.x;
        if(abs(x-y)!=abs(k.x-k.y))
            return abs(x-y)>abs(k.x-k.y);
        return y<k.y;
    }
    bool operator == (const item &k) const{
        return x==k.x && y==k.y;
    }
    item operator * (item c){
        c.v*=v;
        c.x+=x;
        c.y+=y;
        return c.v!=0?c:item(0,0,0);
    }
};

struct poly{
    vector<item> sorce;
    void init(int &str){
        sorce.clear();
        item temp;
        while(arr[str]){
            if(str!=0)
                str++;
            temp.init(str);
            sorce.push_back(temp);
        }
        sort(sorce.begin(),sorce.end());
    }
    void out(){
        for(int i=0;i<sorce.size();i++){
            sorce[i].out();
            printf(i<sorce.size()-1?"+":"\n");
        }
    }
    void uni(){
        sort(sorce.begin(),sorce.end());
        vector<item> tem=sorce;
        sorce.clear();
        for(int i=0;i<tem.size();i++){
            item &ed=sorce[sorce.size()-1];
            if(tem[i]==ed)
                ed.v+=tem[i].v;
            else
                sorce.push_back(tem[i]);
        }
    }
};

poly add(poly a,poly b){
    poly ans=a;
    for(int i=0;i<b.sorce.size();i++)
        ans.sorce.push_back(b.sorce[i]);
    ans.uni();
    return ans;
}

poly muti(poly a,poly b){
    poly c;
    for(int i=0;i<a.sorce.size();i++)
        for(int j=0;j<b.sorce.size();j++)
            c.sorce.push_back(a.sorce[i]*b.sorce[j]);
    c.uni();
    return c;
}
int main(){
    int n;
    while(~scanf("%d",&n) && n){
        scanf("%s\n",arr);
        char c=arr[0];
        int t=0;
        scanf("%s",arr);
        poly ans;
        ans.init(t);
        poly temp;
        for(int i=1;i<n;i++){
            scanf("%s",arr);
            t=0;
            temp.init(t);
            if(c=='+')
                ans=add(ans,temp);
            else
                ans=muti(ans,temp);
        }
        ans.out();
    }
    return 0;
}
(⊙v⊙)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《二元齐次对称多项式与二项式定理》推广了二项式定理,建立了由二项式定理的无穷多个等价公式构成的集合B,给出了它们在多方面的应用,获得了数以百计的新的数学公式。 在微分学上,我们作了与前面完全平行的工作,即推广了莱布尼兹定理(公式);建立了由莱布尼兹定理(公式)的全体等价公式构成的无穷集合L。集合B与集合L间存在一一对应关系。给出了莱布尼兹定理(公式)的等价公式的一些有趣的应用。 《二元齐次对称多项式与二项式定理》的内容简介如下: 十七世纪著名的英国天才数学家、物理学家、力学家、天文学家牛顿(Newton,1642—1727)于1676年发现:任意一个二项式的任意次方幂的展开式的系数全是组合数,即(公式)(请参照书本) 这就是著名的牛顿二项式定理。其中a是实数,(公式)(请参照书本)。其后300多年来未见二项式定理有什么值得称道的新发展;然而科学实验、生产实践的发展却从不停滞,客观现实也都希望二项式定理能发挥更大的作用,但现状总难于改观。 为使二项式定理系列能涵盖更多的内容,扩大其使用的范围,笔者独辟蹊径,从对称多项式基本定理出发,由考虑二元齐次对称多项式与二项式定理间的关系入手,取得了可喜的进展。 众所周知,二元齐次对称多项式的一般形式为:(公式)(请参照书本)。 二元齐次对称多项式的全体构成的无穷集合为(公式)(请参照书本)。 将S中的每个多项式的初等表达式都写出后,便得到无穷多个恒等式,这无穷多个恒等式构成的集合记作B,即(公式)(请参照书本)。 我们要指出下面的结论: (1)已经将二项式定理推广成非常一般的形式; (2)集合B是由二项式定理和它的全部等价公式所构成的一个无穷集合; (3)无穷集合s与B的元素之间存在一一对应关系; (4)集合S、B的元素是完全平等的,无主次之分、无贵贱之别; (5)主要应用:将二项式定理的等价公式应用到算术、代数、三角函数、反三角函数、双曲函数、反双曲函数等方面,不仅能导出数以百计(远多于一百)的新的数学公式;特别应用到组合计数问题上,彻底地将历史遗留下来的解的大量不合情理的、不可理喻的表达形式,作了“根除术”后,恢复了本来面目。 由于微分学上的莱布尼兹(Leibniz,1646—1716)公式(定理)的展开式的系数与代数学上的二项式定理(公式)的展开式的相应系数完全一致,这又诱导我们在微分学上做了与代数学上完全平行的工作。即推广了莱布尼兹定理,建立了由莱布尼兹公式及它的无穷多个等价公式所构成的一个无穷集合:(公式)(请参照书本)。 莱布尼兹定理的等价公式也有多方面的应用,在此我们仅指出:将它们应用到某些不定积分的计算上,能将求不定积分的运算转化成求导的运算,这是一件令人难以置信的事。 考虑到《二元齐次对称多项式与二项式定理》的总结与提高,在全书的最后安排了第九章,简单介绍了一个代数系统——线性空间。线性空间的基本概念,在科技领域内已可以算得上是常识性的内容(概念)了,熟悉这一重要而又基本的概念是非常必要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值