C++实现多项式相加(hnust)

在这里插入图片描述
在这里插入图片描述
关键在于取出字符串中的数字
代码如下:
#include
#include <stdio.h>
using namespace std;
#define MAXSIZE 100
typedef int Status;
typedef struct LNode{
int x, m; //幂和系数; struct LNode next; int length;} LNode, Linklist;int main(){ int i = 0, j = 0, s, t; int flag; char m[1000], n[1000]; Linklist p,L, q, T; L = new LNode; T = new LNode; L->next = NULL; T->next = NULL; q = L; gets(m); gets(n); /--------m[i]的取系数和取幂数--------/ while (m[i] != ‘\0’) //到底为止; { s = 0; t = 0; Linklist p; p = new LNode; p->next=NULL; if (i == 0) { s = 0; t = 0; if (m[i] == ‘-’) { i = i + 1; while (m[i] != ‘+’ && m[i] != ‘x’&&m[i]!=’-’) { s = s * 10 + (m[i] - ‘0’); i++; } p->x = -s; // cout << p->x; //注意删掉 p->next = NULL; L->next = p; q = p; } else //m[i]!=’-’ { //求第一项的系数; while (m[i] != ‘+’ && m[i] != ‘x’&&m[i]!=’-’) { s = s * 10 + (m[i] - ‘0’); i++; } p->x = s; //cout << p->x; //注意删掉 p->next = NULL; L->next = p; q = p; } } else if (i != 0) { flag=0; //cout<<i; s = 0; t = 0; if(m[i]’+’){flag=1;} else flag=0; i = i + 1; //+后必然是数字; if(m[i]‘x’) { if(flag)p->x=1; else p->x=-1; } else { while (m[i] != ‘x’) { s = s * 10 + (m[i] - ‘0’); i++; } if(flag) p->x = s; else p->x=-s; } //cout << p->x; p->next = NULL; q->next = p; q = p; } if (m[i] == ‘+’||m[i]’-’) { p->m = 0; } else if (m[i] == ‘x’) { if (m[i + 1] == ‘+’||m[i+1]’-’) //考虑x的时候 { i = i + 1; //两种情况的i最后输出相同; p->m = 1; } else if (m[i + 1] == ‘^’) { i = i + 2; while (m[i] != ‘+’ && m[i] != ‘\0’&&m[i]!=’-’) { t = t * 10 + (m[i] - ‘0’); i++; } p->m = t; } } }

/--------m[i]的取系数和取幂数--------/
/--------n[i]的取系数和取幂数--------/ i=0;j=0;flag=0; q=T; while (n[i] != ‘\0’) //到底为止; { s = 0; t = 0; Linklist p; p = new LNode; p->next=NULL; if (i == 0) { s = 0; t = 0; if (n[i] == ‘-’) { i = i + 1; while (n[i] != ‘+’ && n[i] != ‘x’&&n[i]!=’-’) { s = s * 10 + (n[i] - ‘0’); i++; } p->x = -s; // cout << p->x; //注意删掉 p->next = NULL; T->next = p; q = p; } else //n[i]!=’-’ { //求第一项的系数; while (n[i] != ‘+’ && n[i] != ‘x’&&n[i]!=’-’) { s = s * 10 + (n[i] - ‘0’); i++; } p->x = s; //cout << p->x; //注意删掉 p->next = NULL; T->next = p; q = p; } } else if (i != 0) { flag=0; //cout<<i; s = 0; t = 0; if(n[i]’+’){flag=1;} else flag=0; i = i + 1; //+后必然是数字; if(n[i]‘x’) { if(flag) p->x=1; else p->x=-1; } while (n[i] != ‘x’) { s = s * 10 + (n[i] - ‘0’); i++; } if(flag) p->x = s; else p->x=-s; //cout << p->x; p->next = NULL; q->next = p; q = p; } //求第一项的幂数;0/1/其他项情况显然在它其中(非0正整数); if (n[i] == ‘+’||n[i]’-’) { p->m = 0; } else if (n[i] == ‘x’) { if (n[i + 1] == ‘+’||n[i+1]’-’) //考虑x的时候 { i = i + 1; //两种情况的i最后输出相同; p->m = 1; } else if (n[i + 1] == ‘^’) { i = i + 2; while (n[i] != ‘+’ && n[i] != ‘\0’&&n[i]!=’-’) { t = t * 10 + (n[i] - ‘0’); i++; } p->m = t; } } }
/-----------实现多项式的相加-------/
Linklist S,k;//和多项式
S=new LNode;
S->next=NULL;
k=S;
p=L->next;
q=T->next;
while(p!=NULL&&q!=NULL)
{
Linklist r;
r=new LNode;
r->next=NULL;
if(p->m==q->m)
{
if((p->x)+(q->x)!=0)
{
r->x=p->x+q->x;
r->m=p->m;
k->next=r;
k=r;
}
p=p->next;
q=q->next;
}
else if(p->mm)
{
r->x=p->x;
r->m=p->m;
k->next=r;
k=r;
p=p->next;
}
else if(p->m>q->m)
{
r->x=q->x;
r->m=q->m;
k->next=r;
k=r;
q=q->next;
}

}
k->next=p?p:q;
/*----相加结束打印结果--------*/
for(q=S->next;q;q=q->next)
{
    /*---打印系数----*/
    if(q==S->next)
    {
        if(q->x!=1||q->m!=-1)cout<<q->x;
        if(q->x==-1)cout<<"-";
    }
    else
    {
        if(q->x>0&&q->x!=1&&q->x!=-1)
        cout<<"+"<<q->x;
        if(q->x==1)
            cout<<"+";
        if(q->x==-1)
            cout<<"-";
        if(q->x<0&&q->x!=-1)
        {
            cout<<q->x;
        }

    }
    if(q->m!=0)
    {
        if(q->m==1)
        cout<<"x";
        else
        {
            cout<<"x^"<<q->m;
        }
    }
}
cout<<endl;
p=S->next;
q=S;
q=NULL;
while(p)
{

    S=p;
    p=p->next;
    S->next=q;
    q=S;
}
 for(q=S;q;q=q->next)
{
    /*---打印系数----*/
    if(q==S)
    {

        if(q->x!=1||q->m!=-1)cout<<q->x;
        if(q->x==-1)cout<<"-";
    }
    else
    {
       if(q->x>0&&q->x!=1&&q->x!=-1)
        cout<<"+"<<q->x;
        if(q->x==1&&q->m!=0)
            cout<<"+";//首项无需考虑;
        if(q->x==1&&q->m==0)//正序不用考虑的
            cout<<"+"<<1;
        if(q->x==-1)
            cout<<"-";
        if(q->x==-1&&q->m==0)
            cout<<"-"<<1;
        if(q->x<0&&q->x!=-1)
        {
            cout<<q->x;
        }

    }
    if(q->m!=0)
    {
        if(q->m==1)
        cout<<"x";
        else
        {
            cout<<"x^"<<q->m;
        }

    }
}
cout<<endl;

}
/自创测试数据:-3-x-9x2-10x3
4+2x-3x2-12x3
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值