每日一题Day21

基于顺序表的两个一元多项式的基本运算

描述

给定两个一元多项式A(x)与B(x),利用顺序表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。

输入

输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两个整数a和b,分别代表A(x)与B(x)的项数。之后紧跟a行,每行两个整数a1和a2,分别代表A(x)每项的系数和指数,再之后紧跟b行,每行两个整数b1和b2,分别代表B(x)每项的系数和指数,每组数据最后一行为一个字符(+、-、*、'),分别代表多项式的加法、减法、乘法和求导运算。所有数据的绝对值小于100,指数大于等于0。

输出

对于每组数据输出一行,按照多项式次数从大到小排列,参考格式:5x^17+22x^7+11x^1+7。

样例输入1 

4
1 1
1 0
1 1
+
4 3
7 0
3 1
9 8
5 17
8 1
22 7 
-9 8
+
1 1
1 1
1 1
-
1 1
1 1
1 1
'

样例输出1

1x^1+1
5x^17+22x^7+11x^1+7
0
1
1

解答:由于指数范围为-100到100,所以用指数加100对应数组位置保存相应的系数。特别要注意输出格式,以及符号!

#include<stdio.h>
#define maxn 222

int e1[maxn];
int e2[maxn];
int ans[2*maxn];

int main()
{
	int T;
	int a,b;
	int x,y;
	char op;
	scanf("%d",&T);
	while(T--)
	{
		for(int i=0; i<maxn; i++)
		{
			e1[i]=0;
			e2[i]=0;
		}
		for(int i=0; i<2*maxn; i++)
		{
			ans[i]=0;
		}
		scanf("%d %d\n",&a,&b);
		while(a--)
		{
			scanf("%d %d",&x,&y);
			e1[y+100]+=x;
		}
		while(b--)
		{
			scanf("%d %d",&x,&y);
			e2[y+100]+=x;
		}
		getchar();
		scanf("%c",&op);
		int first=1;
		if(op=='+')
		{
			for(int i=0; i<maxn; i++)
			{
				e1[i]+=e2[i];
			}
			for(int i=221; i>=0; i--)
			{
				if(e1[i])
				{
					if(first)
					{
						if(i-100==0)
							printf("%d",e1[i]);
						else
							printf("%dx^%d",e1[i],i-100);
						first=0;
					}
					else
					{
						if(e1[i]>0)
							printf("+");
						if(i-100==0)
							printf("%d",e1[i]);
						else
							printf("%dx^%d",e1[i],i-100);
					}
				}
			}
			if(first)
				printf("0\n");
			else
				printf("\n");
		}
		if(op=='-')
		{
			for(int i=0; i<maxn; i++)
			{
				e1[i]-=e2[i];
			}
			for(int i=221; i>=0; i--)
			{
				if(e1[i])
				{
					if(first)
					{
						if(i-100==0)
							printf("%d",e1[i]);
						else
							printf("%dx^%d",e1[i],i-100);
						first=0;
					}
					else
					{
						if(e1[i]>0)
							printf("+");
						if(i-100==0)
							printf("%d",e1[i]);
						else
							printf("%dx^%d",e1[i],i-100);
					}
				}
			}
			if(first)
				printf("0\n");
			else
				printf("\n");
		}
		if(op=='*')
		{
			int x,y;
			for(int i=0; i<maxn; i++)
			{
				if(e1[i]==0)
					continue;
				for(int j=0; j<maxn; j++)
				{
					if(e2[j]==0)
						continue;
					x=e1[i]*e2[j];
					y=i+j;
					ans[y]+=x;
				}
			}
			for(int i=410; i>=0; i--)
			{
				int x=ans[i];
				int y=i-200;
				if(x)
				{
					if(first)
					{
						if(y==0)
							printf("%d",x);
						else
							printf("%dx^%d",x,y);
						first=0;
					}
					else
					{
						if(x>0)
							printf("+");
						if(y==0)
							printf("%d",x);
						else
							printf("%dx^%d",x,y);
					}
				}
			}
			if(first)
				printf("0\n");
			else
				printf("\n");
		}
		if(op=='\'')
		{
			for(int i=210; i>=0; i--)
			{
				if(e1[i])
				{
					int x=(i-100)*e1[i];
					int y=i-100-1;
					if(x)
					{
						if(first)
						{
							if(y==0)
								printf("%d",x);
							else
								printf("%dx^%d",x,y);
							first=0;
						}
						else
						{
							if(x>0)
								printf("+");
							if(y==0)
								printf("%d",x);
							else
								printf("%dx^%d",x,y);
						}
					}
				}
			}
			if(first)
				printf("0\n");
			else
				printf("\n");
			first=1;
			for(int i=210; i>=0; i--)
			{
				if(e2[i])
				{
					int x=(i-100)*e2[i];
					int y=i-100-1;
					if(x)
					{
						if(first)
						{
							if(y==0)
								printf("%d",x);
							else
								printf("%dx^%d",x,y);
							first=0;
						}
						else
						{
							if(x>0)
								printf("+");
							if(y==0)
								printf("%d",x);
							else
								printf("%dx^%d",x,y);
						}
					}
				}
			}
			if(first)
				printf("0\n");
			else
				printf("\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81566237