noj 1006 多项式乘法

该博客介绍了一种解决一元整系数多项式乘法问题的方法,包括输入输出格式、样例输入输出以及解题思路。解题思路涉及两层循环处理小项相乘,使用数组存储指数和系数,并进行排序去重,最终输出乘积结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

比赛描述

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

现给两个一元整系数多项式,请求解两者的乘积。

输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序。每一组结束行输入为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
6X^24+12X^22-16X^18-50X^16+12X^12+76X^10+8X^8-36X^4-12X^2

提示

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

题目来源

CHENZ

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

解题思路:前半部分同noj 1005。多项式相乘的结果用另外两个数组存储,两层for循环保证每一个小项相乘得到新的小项,系数相乘,指数相加,例如系数为x,指数为y,用数组cy[]=y 存储指数,用数组c[y]=x存储指数y对应的系数x,因此在小项相乘的同时,用 c[y]+=x 可以很方便地合并同类项。然后对cy[]从大到小排序去重,最后输出即可。

代码如下:

#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 cy[maxn],c[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=0;
    memset(c,0,sizeof(c));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            x=ax[i]*bx[j];
            y=ay[i]+by[j];
            cy[len++]=y;
            c[y]+=x;
        //  printf("%d %d\n",x,y );
        }
    sort(cy,cy+len);
    len=unique(cy,cy+len)-cy;
    for(int i=len-1;i>=0;i--)
    {
        if(c[cy[i]]==0)
            continue;
        if(c[cy[i]]!=1 && (f || c[cy[i]]<0))
        {
            if(c[cy[i]]==-1 && cy[i]!=0)
                printf("-");
            else
                printf("%d",c[cy[i]]);
        }
        else
        { 
            if(c[cy[i]]==1)
            {
                if(f)
                {
                    if(cy[i]==0)
                        printf("1");
                }
                else
                {
                    if(cy[i]==0)
                        printf("+1");
                    else
                        printf("+");
                }
            }
            else if(c[cy[i]]!=1 && !f)
                printf("+%d", c[cy[i]]);
        }
        if(cy[i]==1)
            printf("X");
        else if(cy[i]!=0)
            printf("X^%d", cy[i]);
        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、付费专栏及课程。

余额充值