题目描述
实现两个一元多项式相减运算。
提示:当两个多项式相减为0时,要输出“0”。
输入
按2.3.1的格式,第一、二行输入被减数;第三、四行输入减数。
输出
按2.3.1的格式,输出差多项式。
样例输入
4
(6,0)(2,6)(8,7)(4,15)
5
(7,1)(2,6)(-8,7)(10,20)(16,30)
样例输出
6-7X+16X^7+4X^15-10X^20-16X^30
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n1, n2;
int n;
int a[100][3], b[100][3];
scanf("%d", &n1);
getchar();
for(int i=1; i<=n1; i++)
{
scanf("(%d,%d)", &a[i][1], &a[i][2]);
}
scanf("%d", &n2);
getchar();
for(int i=1; i<=n2; i++)
{
scanf("(%d,%d)", &b[i][1], &b[i][2]);
}
n=subtraction(a, b, n1, n2);
sort(a, n);
print(a, n);
return 0;
}
int subtraction(int max[][3], int min[][3], int n1, int n2)
{
int cnt=n1+1;
for(int i=1; i<=n2; i++)
{
int flag=1;
for(int j=1; j<=n1; j++)
{
if(min[i][2]==max[j][2])
{
max[j][1]-=min[i][1];
flag=0;
break;
}
}
if(flag)
{
max[cnt][1]=-min[i][1];
max[cnt++][2]=min[i][2];
}
}
return cnt-1;
}
void sort(int a[][3], int n)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n-i; j++)
{
if(a[j][2]>a[j+1][2])
{
int t=a[j+1][2];
a[j+1][2]=a[j][2];
a[j][2]=t;
t=a[j+1][1];
a[j+1][1]=a[j][1];
a[j][1]=t;
}
}
}
}
void print(int a[][3], int n)
{
int cnt=0;
for(int i=1; i<=n; i++)
{
if(a[i][1]==0)
{
if(cnt!=0 && a[i+1][1]>0 && i!=n)
printf("+");
}
else if(a[i][1]==1)
{
if(a[i][2]==0){
printf("1");
cnt=1;
}
else if(a[i][2]==1){
printf("X");
cnt=1;
}
else{
printf("X^%d", a[i][2]);
cnt=1;
}
if(a[i+1][1]>0 && i!=n)
printf("+");
}
else if(a[i][1]==-1)
{
if(a[i][2]==0){
printf("-1");
cnt=1;
}
else if(a[i][2]==1){
printf("-X");
cnt=1;
}
else{
printf("-X^%d", a[i][2]);
cnt=1;
}
if(a[i+1][1]>0 && i!=n)
printf("+");
}
else
{
if(a[i][2]==0){
printf("%d", a[i][1]);
cnt=1;
}
else if(a[i][2]==1){
printf("%dX", a[i][1]);
cnt=1;
}
else{
printf("%dX^%d", a[i][1], a[i][2]);
cnt=1;
}
if(a[i+1][1]>0 && i!=n)
printf("+");
}
}
}