题目
设计函数分别求两个一元多项式的乘积与和
输入格式:
输入分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
算法思想
两多项式加法
- qa和qb分别指向A多项式与B多项式的当前进行比较的结点
- qa与qb均不为空时,比较qa结点与qb结点的指数:
(1)qa的指数<qb的指数:将qa指向的结点插入新多项式后,qa指向后继
(2)qa的指数>qb的指数:将qb所指向的结点插入新多项式后,qb指向后继
(3)qa的指数=qb的指数:将两项的系数相加后,赋值于qa的系数并插入新多项式后,qa与qb均指向后继 - 当其中一式子为空时,将另一式子的余项插入新多项式后
代码如下
void AddPloy(LinkList A,LinkList B,LinkList &C){
LinkList p,q,x,y;//p遍历A,q遍历B,x为插入C的新结点 ,y遍历C
p = A->next;
q = B->next;
y = C;
C->length = 0;
while(p&&q){
x = (LNode*)malloc(sizeof(LNode));
x->next = NULL;
if(p->exp > q->exp){
x->c = p->c;
x->exp = p->exp;
p = p->next;
y->next = x;
y = x;
C->length++;
}
else if(p->exp < q->exp){
x->c = q->c;
x->exp = q->exp;
q = q->next;
y->next = x;
y=x;
C->length++;
}
else if(p->exp == q->exp){
x->c = p->c + q->c;
if(x->c != 0){
x->exp = p->exp;
p = p->next;
q = q->next;
y->next = x;
y = x;
C->length++;
}
else {
p = p->next;
q = q->next;
}
}
}
while(p){
x = (LNode*)malloc(sizeof(LNode));
x->next = NULL;
x->c = p->c;
x->exp = p->exp;
p = p->next;
y->next = x;
y = x;
C->length++;
}
while(q){
x = (LNode*)malloc(sizeof(LNode));
x->next = NULL;
x->c = q->c;
x->exp = q->exp;
q = q->next;
y->next = x;
y=x;
C->length++;
}
}
两多项式乘法
将乘法运算转换为加法运算
(将A当前项B多项式,再加到结果多项式里)
- 初始D,pa指向A的头结点,pb指向B的头结点
- 先用A的第一项乘B的所有项,并使得每项加入D的合适位置,使得D有初始值
- 再用A的余项依次乘B的所有项并加入D中合适位置
代码如下
void MultPloy(LinkList A,LinkList B,LinkList &D){
LinkList pa,pb;
LinkList q,rear;
pa = A->next;
pb = B->next;
rear = D;
//用A的第一项去乘B中的所有项,为D的初始值。
if(pa&&pb){
while(pb){
q = (LNode*)malloc(sizeof(LNode));
q->c = pa->c * pb->c;
q->exp = pa->exp + pb->exp;
q->next = NULL;
rear->next = q;
rear = q;
pb = pb->next;
}
}
//A余下的项依次去乘B中所有项并找到合适位置插入
pb = B->next;
pa = pa->next;
if(pa&&pb){
while(pa){
while(pb){
q = (LNode*)malloc(sizeof(LNode));
q->c = pa->c * pb->c;
q->exp = pa->exp + pb->exp;
q->next = NULL;
{
LinkList p = D;
while(p->next){
if(p->next->exp > q->exp){
p = p->next;
if(p->next == NULL){
p->next = q;
break;
}
}
else if(p->next->exp == q->exp){
p->next->c = p->next->c + q->c;
if(p->next->c == 0) p->next = p->next->next;
break;
}
else if(p->next->exp <q->exp){
q->next = p->next;
p->next = q;
break;
}
}
}
pb = pb->next;
}
pb = B->next;
pa = pa->next;
}
}
}