现在的位置: 首页 > 综合 > 正文

1396 n元多项式相加

2012年07月23日 ⁄ 综合 ⁄ 共 1136字 ⁄ 字号 评论关闭
 
描述

考虑到n元多项式乘法太BT了,改成加法,毕竟只有对应元指数完全相同的项才会相加嘛……

对于n元多项式的表示,会给出一个k*(n+1)的矩阵表示

其中k表示有多少项,每个式子不超过1000项;

2~n列表示对应的元在该项的指数,第一列表示对应项的系数;

例如式子A有2项,是个3元多项式,那么给出矩阵就是5*4的矩阵

1 1 1 1

2 2 1 2

不妨假设3元为x,y,z,那么上诉矩阵对应式子A数学表达式为:

1*x^1*y^1*z^1 + 2*x^2*y^1*z^2

给出两个式子F,G,请输出F+G的答案,输出格式和输入类似,要求按照从第2~n列的顺序的升序,例如当N=2时,输出顺序应该这样:

1 0 1

2 1 0

对于给定的式子A,保证每一项中至少有一个元的指数非零。

对于输出结果如果某一项的系数为0,则不输出该项。

输入

输入第一行包含一个整数T,表示有T组测试数据;

对于每组测试数据:

第一行包含3个数据n,k1,k2,分别表示n元,第一个式子的项数k1,第二个式子的项数k2;

接下来的两个矩阵k1*(n+1)与k2*(n+1)则由题目描述;

保证n元不多于100元;

输出

输出格式按照题目描述要求输出;

 

 

找到对应关系即可

#include <stdio.h>
#include <string.h>


main()
{
	int i,j,t,number,n,k1,k2,xi[3001];
	char a[3001][500];
	int flag=1;
	int temp;
	char b[500];
	int num;
	scanf("%d",&number);
	for( t=0;t<number;t++)
	{
		scanf("%d %d %d",&n,&k1,&k2);
		
		for(i=0;i<k1;i++)
		{ 
			scanf("%d",&xi[i]);
		    gets(a[i]);
		 
		 

		}
		num=k1;
		for(i=0;i<k2;i++)
		{
			flag=1;
			scanf("%d",&temp);
		    gets(b);
		   
			for( j=0;j<num;j++)
			{
				if(strcmp(a[j],b)==0)
				{ 	
					xi[j]+=temp;
					flag=0;
					break;
				} 
			}
			if(j==num&&flag!=0)
			{ 	
				strcpy(a[j],b);
				xi[j]=temp;
				num++;
			}
		}

		for(i=0;i<num;i++)
			for(j=i;j<num;j++)
			{
				if(strcmp(a[i],a[j])>0)
				{
					strcpy(b,a[j]);
					strcpy(a[j],a[i]);
					strcpy(a[i],b);
					temp=xi[j];
					xi[j]=xi[i];
					xi[i]=temp;
				}
			}

			for(i=0;i<num;i++)
			{
				if(xi[i]!=0)
					printf("%d%s\n",xi[i],a[i]);
			}
		
	}

 return 0;
}

 

抱歉!评论已关闭.