运用顺序表实现多项式相加

本题要求输入两个一元多项式,然后输出它们的和(相加后得到的一元多项式)

输入格式:

输入一个整数n(表示输入组数),然后依次输入每一组数据:
输入一个整数A(表示多项式的项数,小于100),然后输入A对整数,每一对整数表示对应项的指数和系数。

输出格式:

对每一组输入,在一行中输出得到的一元多项式。

输入样例:

在这里给出一组输入。例如:

2
5
0 2
1 4
5 7
7 10
8 19
4
0 3
2 6
4 19
5 -9
3
0 3
4 7
8 2
3
0 -3
5 9
7 21

输出样例:

在这里给出相应的输出。例如:

5x^0+4x^1+6x^2+19x^4-2x^5+10x^7+19x^8
7x^4+9x^5+21x^7+2x^8

以下是帮助大家参考的源代码:

#include<stdio.h>
int main(){
    int n,i,j=0,max=0,sum=0,temp=0,a[35][2];
    scanf("%d",&n);
    //输入相关的数据
    for(i=1;i<=n;i++){
        int m;
        scanf("%d",&m);
        sum+=m;
        for(;j<sum;j++){
            scanf("%d %d",&a[j][0],&a[j][1]);
            if(i==0)
                max=a[j][0];
	        else if(max<a[j][0])
	            max=a[j][0];
        }          
    }
    temp=j;        
    for(i=1;i<=n;i++){
        int m;
        scanf("%d",&m);
        sum+=m;
        for(;j<sum;j++){
            scanf("%d %d",&a[j][0],&a[j][1]);
            if(i==0)
                max=a[j][0];
            else if(max<a[j][0])
                max=a[j][0];
       }           
    }      
                                                                     
    int sum1=0,initial=0,enter=0,noagain=0;
    j=0;
    //遍历多项式,先记住所输入的最大指数 
    while(1){     
       for(i=0;i<=temp-1;i++){     
            if(a[i][0]==j){
                 sum1+=a[i][1]; enter=1;           
	    	}
		    if((i+1==sum)&&sum1==0&&enter==1&&noagain==0){
       	        initial=1;
		    }
        }  
		enter=0;
        if((j==0||sum1<0)&&sum1!=0){	
		    printf("%dx^%d",sum1,j);
        }
        else if(sum1>0&&sum1!=0&&initial==1){
		    printf("%dx^%d",sum1,j);
		    initial=0;noagain=1;
        }
	    else if(sum1>0&&sum1!=0){
		    printf("+%dx^%d",sum1,j);
	    } 
        sum1=0;
        if(j==max)
            break;
        j++;      
    }
    printf("\n"); 
    j=0;enter=0;noagain=0;initial=0;  
    while(2){     
       for(i=temp;i<sum;i++){  
            //i为对数的数量 
            //从每组数中寻找对应指数的系数,找到后相加 
            if(a[i][0]==j){
             sum1+=a[i][1]; enter=1;           
            //问题就在这里            
	    	}
		    if((i+1==sum)&&sum1==0&&enter==1&&noagain==0){
       	        initial=1;
		    }
        }  
	    enter=0;                       
        if((j==0||sum1<0)&&sum1!=0){	
		    printf("%dx^%d",sum1,j);
        }
        else if(sum1>0&&sum1!=0&&initial==1){
		    printf("%dx^%d",sum1,j);
		    initial=0;noagain=1;
        }
	    else if(sum1>0&&sum1!=0){
		    printf("+%dx^%d",sum1,j);
	    }   	
	    if(j==max)break;    
	    sum1=0;
	    j++;      
    }   
    return 0;                
}

希望能够帮到你,有问题可以随时提问,我们一起进步吧! 

如果你觉得这篇内容对你有所启发或者帮助,请不要吝啬一个赞哦,让更多需要帮助的人看到它吧!

符号多项式的操作,已经成为表处理的典型用例。在数学上,一个一元多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的序号里。 假设Qm(x)是一元m次多项式,同样可用线性表Q来表示:Q = (q0 ,q1 ,q2 ,… qm)。 不失一般性,设m<n,则两个多项式相加的结果 Rn(x) = Pn(x)+Qm(x)可用线性表R表示:R = (p0+q0 , p1+q1 , p2 +q2 , … , pm +qm , pm+1 ,… pn)。显然,我们可以对P、Q和R采用顺序存储结构, 使得多项式相加算法定义十分简洁。至此,一元多项式的表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难 决定。特别是在处理形如:S(x) = 1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来 表示,表中仅有三个非零元素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项 则显然必须同时存储相应的指数。 一般情况下的一元n次多项式可写成: Pn(x) = p1x e1 + p2x e2 + … + pmx em 其中 pi,是指数为 ei 的项的非零系数,且满足 0 ≤ e1 < e2 < …< em = n,若用一个长度为 m 且 每个元素有两个数据项(系数项和指数项)的线性表便可唯一确定多项式 Pn(x)。 ((p1 ,e1) , (p2 ,e2) , … ,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。但 是,对于 S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个一元多项式,并在此结构上实现一元多 项式的加法,减法和乘法操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平静方能至远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值