• PTA 02-线性结构2 一元多项式的乘法与加法运算 (20分)


    原题地址

    https://pta.patest.cn/pta/test/15/exam/4/question/710

    5-2 一元多项式的乘法与加法运算   (20分)

    设计函数分别求两个一元多项式的乘积与和。

    输入格式:

    输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

    输出格式:

    输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

    输入样例:

    4 3 4 -5 2  6 1  -2 0
    3 5 20  -7 4  3 1
    

    输出样例:

    15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
    5 20 -4 4 -5 2 9 1 -2 0


    /*
    评测结果
    时间	结果	得分	题目	编译器	用时(ms)	内存(MB)	用户
    2017-07-08 15:53	答案正确	20	5-2	gcc	3	1	
    测试点结果
    测试点	结果	得分/满分	用时(ms)	内存(MB)
    测试点1	答案正确	12/12	3	1
    测试点2	答案正确	4/4	2	1
    测试点3	答案正确	2/2	2	1
    测试点4	答案正确	2/2	1	1
    
    框架
    -	读入
    -	处理
    	-- 处理加法
    	-- 处理乘法
    -	输出
    
    结构:结构数组
    
    	系数
    	幂数
    	当前下标
    	最大下标
    
    量
    	存第一行
    	存第二行
    	存第一行第二行的和
    	存当前乘法结果
    	存之前的结果
    */
    #include<stdio.h>
    #define MAXLEN 10000
    struct item{
    	int coefficient;
    	int index;
    };
    
    typedef struct multinomial{
    	struct item data[MAXLEN];
    	int len;
    }MN;
    
    MN mulA,mulB,mulSum,mulProduct;
    
    void MnCopyFirstToSecond(MN *a,MN *b)
    {
    	int i,j;
    	b->len=a->len;
    	for(i=0;i<a->len;i++)
    	{
    		b->data[i].coefficient=a->data[i].coefficient;
    		b->data[i].index=a->data[i].index;
    	}
    }
    void CalcPlus( MN mA,MN mB,MN *mSum)
    {
    	int i=0,j=0;
    	mSum->len=0;
    	while(i<mA.len && j<mB.len) //两个串都没结束 
    	{
    		if(mA.data[i].index>mB.data[j].index){
    			if(mA.data[i].coefficient==0){//提防0系数 
    				i++;
    				continue;
    			}
    			mSum->data[mSum->len].coefficient=mA.data[i].coefficient;
    			mSum->data[mSum->len].index=mA.data[i].index;
    			mSum->len++;
    			i++;
    		}
    		else if(mB.data[j].index>mA.data[i].index){
    			if(mB.data[j].coefficient==0){//提防0系数 
    				j++;
    				continue;
    			}
    			mSum->data[mSum->len].coefficient=mB.data[j].coefficient;
    			mSum->data[mSum->len].index=mB.data[j].index;
    			mSum->len++;
    			j++;
    		}
    		else if(mA.data[i].index==mB.data[j].index){
    			if(mA.data[i].coefficient+mB.data[j].coefficient==0){//考虑相加得0的情况 
    				i++;
    				j++;
    				continue;	
    			} 
    			mSum->data[mSum->len].coefficient=mA.data[i].coefficient+mB.data[j].coefficient;
    			mSum->data[mSum->len].index=mA.data[i].index;
    			mSum->len++;
    			i++;
    			j++;
    		}
    	}
    	
    	while(i<mA.len){//B结束A没结束 
    			if(mA.data[i].coefficient==0)
    			{
    				i++;
    				continue;
    			}
    			mSum->data[mSum->len].coefficient=mA.data[i].coefficient;
    			mSum->data[mSum->len].index=mA.data[i].index;
    			mSum->len++;
    			i++;
    	}	
    	
    	while(j<mB.len){//A结束B没结束 
    			if(mB.data[j].coefficient==0){
    				j++;
    				continue;
    			}
    			mSum->data[mSum->len].coefficient=mB.data[j].coefficient;
    			mSum->data[mSum->len].index=mB.data[j].index;
    			mSum->len++;
    			j++;
    	}	
    	
    }
    
    
    void CalcMultiply(MN a,MN b,MN *res)
    {
    	MN currentResult,tempSum;
    	currentResult.len=0;
    	tempSum.len=0;
    	int i=0,j=0;
    	while(i<a.len){//多项式逐项相乘 
    		while(j<b.len){
    			currentResult.data[currentResult.len].coefficient=a.data[i].coefficient*b.data[j].coefficient;
    			currentResult.data[currentResult.len].index=a.data[i].index+b.data[j].index;
    			currentResult.len++;
    			j++;
    		}
    		CalcPlus(currentResult,tempSum,res);
    		MnCopyFirstToSecond(res,&tempSum);//CalcPlus()函数中第二个参数与第三个不能相同,故把最近一次累加的结果复制到tempSum中去。 
    		currentResult.len=0;
    		i++;
    		j=0;
    		
    	}
    
    }
    
    
    void GetInput()
    {
    	int i;
    	
    	scanf("%d",&i);
    	mulA.len=i;
    	for(i=0;i<mulA.len;i++)
    		scanf("%d %d",&mulA.data[i].coefficient,&mulA.data[i].index);
    		
    	scanf("%d",&i);
    	mulB.len=i;
    	for(i=0;i<mulB.len;i++)
    		scanf("%d %d",&mulB.data[i].coefficient,&mulB.data[i].index);
    }
    
    void PrintResult(MN m)
    {
    	if(m.len==0)
    	{
    		printf("0 0");
    		return;
    	}
    	int i;
    	for	(i=0;i<m.len;i++)
    	{			
    			printf("%d %d",m.data[i].coefficient,m.data[i].index);
    			if(i!=m.len-1)
    				putchar(' ');
    			
    	}
    }
    
    int main()
    {
    	GetInput();
    	CalcMultiply(mulA,mulB,&mulProduct);
    	PrintResult(mulProduct);
    	putchar('
    ');
    	CalcPlus(mulA,mulB,&mulSum);
    	PrintResult(mulSum);
    }
    

      

  • 相关阅读:
    hdu2476 string painter
    lightoj1422 Halloween Costumes
    cf1369D---找规律,递推
    cf1368D---贪心
    cf1373D---思维,最大子段和
    poj2279 Mr. Young's Picture Permutations
    AT2442 fohen phenomenon 差分
    poj2796 feel good 单调栈
    poj2082 terrible sets 单调栈
    洛谷P2979 cheese towers
  • 原文地址:https://www.cnblogs.com/gk2017/p/7140508.html
Copyright © 2020-2023  润新知