noj 1005 多项式加法

多项式加法
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 3168 测试通过 : 460

比赛描述

线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者之和。

输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为

0 -1

输出

三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。

一元整系数多项式输出形式如下:

(1)多项式项4x输出为4X

(2)多项式项4x2输出为4X^2

(3)第一项系数为正数时,加号不要输出

(4)除常系数项外,项系数为1不显式输出,-1输出为-
例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1

样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
3X^14+2X^10-4X^8+2

提示

该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。

题目来源

CHENZ

题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1005

解题思路:用四个数组模拟实现,注意要判断的特殊情况较多,注意:
1.系数为1,0,-1的情况;
2.指数为0和1的情况;
3.第一项前面若是正数不能出现+号;
4.多项式和为0时要输出0,不输出空。
代码写得很凌乱,打补丁的结果。。。知道思路就行了。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=10000+5;
int ax[maxn],ay[maxn];
int bx[maxn],by[maxn];

int main(void)
{
    int x,y;
    bool q=false;
    memset(ax,0,sizeof(ax));
    memset(bx,0,sizeof(bx));
    memset(ay,0,sizeof(ay));
    memset(by,0,sizeof(by));
    bool f=true;
    int n=0,m=0;
    while(scanf("%d%d",&x,&y))
    {
        if(x==0 && y==-1)
            break;
        ax[n]=x;
        ay[n++]=y;
    }
    while(scanf("%d%d",&x,&y))
    {
        if(x==0 && y==-1)
            break;
        bx[m]=x;
        by[m++]=y;
    }
    for(int i=0;i<n;i++)
    {
        if(ax[i]==0)
            continue;
        if(ax[i]!=1 && (f || ax[i]<0))
        {
            if(ax[i]==-1 && ay[i]!=0)
                printf("-");
            else
                printf("%d",ax[i]);
        }
        else
        { 
            if(ax[i]==1)
            {
                if(f)
                {
                    if(ay[i]==0)
                        printf("1");
                }
                else
                {
                    if(ay[i]==0)
                        printf("+1");
                    else
                        printf("+");
                }
            }
            else if(ax[i]!=1 && !f)
                printf("+%d", ax[i]);
        }
        if(ay[i]==1)
            printf("X");
        else if(ay[i]!=0)
            printf("X^%d", ay[i]);
        f=false;
    }
    printf("\n");
    f=true;
    for(int i=0;i<m;i++)
    {
        if(bx[i]==0)
            continue;
        if(bx[i]!=1 && (f || bx[i]<0))
        {
            if(bx[i]==-1 && by[i]!=0)
                printf("-");
            else
                printf("%d",bx[i]);
        }
        else
        {
            if(bx[i]==1)
            {
                if(f)
                {
                    if(by[i]==0)
                        printf("1");
                }
                else
                {
                    if(by[i]==0)
                        printf("+1");
                    else
                        printf("+");
                }
            }
            else if(bx[i]!=1 && !f)
                printf("+%d", bx[i]);
        }
        if(by[i]==1)
            printf("X");
        else if(by[i]!=0)
            printf("X^%d", by[i]);
        f=false;
    }
    printf("\n");
    f=true;
    int len=max(n,m);
    for(int i=0,j=0;i<len,j<len;)
    {
        if(ay[i]>by[j])
        {
            if(ax[i]!=1 && (f || ax[i]<0))
            {
                if(ax[i]==-1 && ay[i]!=0)
                    printf("-");
                else 
                    printf("%d", ax[i]);
            }
            else 
            {
                if(ax[i]==1)
                {
                    if(f)
                    {
                        if(ay[i]==0)
                            printf("1");
                    }
                    else
                    {
                        if(ay[i]==0)
                            printf("+1");
                        else
                            printf("+");
                    }
                }
                else if(ax[i]!=1 && !f)
                    printf("+%d", ax[i]);
            }
            if(ay[i]==1)
                printf("X");
            else if(ay[i]!=0)
                printf("X^%d",ay[i]);
            i++;
            if(f)
                f=false;
        }
        else if(ay[i]<by[j])
        {
            if(bx[j]!=1 && (f || bx[j]<0))
            {
                if(bx[j]==-1 && by[j]!=0)
                    printf("-");
                else
                    printf("%d", bx[j]);
            }
            else 
            {
                if(bx[j]==1)
                {
                    if(f)
                    {
                        if(by[j]==0)
                            printf("1");
                    }
                    else
                    {
                        if(by[j]==0)
                            printf("+1");
                        else
                            printf("+");
                    }
                }
                else if(bx[j]!=1 &&!f)
                    printf("+%d", bx[j]);
            }
            if(by[j]==1)
                printf("X");
            else if(by[j]!=0)
                printf("X^%d",by[j]);
            j++;
            if(f)
                f=false;    
        }
        else
        {
            if(ax[i]+bx[j]==0)
            {
                i++;
                j++;
                continue;
            }
            if(ax[i]+bx[j]!=1 && (f || ax[i]+bx[j]<0))
            {
                if(ax[i]+bx[j]==-1 && by[j]!=0)
                    printf("-");
                else
                    printf("%d",ax[i]+bx[j] );
            }
            else 
            {
                if(ax[i]+bx[j]==1)
                {
                    if(f)
                    {
                        if(by[j]==0)
                            printf("1");
                    }
                    else
                    {
                        if(by[j]==0)
                            printf("+1");
                        else
                            printf("+");
                    }
                }
                else if(ax[i]+bx[j]!=1 && !f)
                    printf("+%d",ax[i]+bx[j]);
            }
            if(by[j]==1)
                printf("X");
            else if(by[j]!=0)
                printf("X^%d",by[j]);
            j++;    
            i++;
            if(f)
                f=false;
            q=true;
        }
    }
    if(q)
        printf("\n");
    else
        printf("0\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值