多项式加法
时间限制(普通/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");
}