This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 2 1.5 1 2.9 0 3.2
分析:同第一个一样,也是2个相加,但是这里是多项式相加,这道题思路很多,主要就是存储的方法有很多种,而我就用了最原始的数据结构的方法--链表,也是想复习下自己链表的知识,所以就自己用链表写出来,所以就采用了c,感觉用c++的话,可以有很多种选择。不过这题有几个需要注意的地方,如果你是部分通过的话,可以看看是不是下面的情况; 1.要注意当2个系数相加为0时,那么这一项是不需要的,如果没考虑,最后三个测试点过不去 2.就是要记得有1条链表为空了,另一条还有的情况
具体的代码中我都详细注释了,从现在开始,想开始养成注释的习惯,所以以后的代码都会详细注释清楚的
code:
#include <stdio.h>
#include <stdlib.h>
typedef struct node //结点结构
{
int exp; //指数
double coe; //系数
struct node *next; //指向下一个
}Polynomial;
Polynomial* createPolynomial(Polynomial *head,int K);
Polynomial* plusPolynomial(Polynomial *a,Polynomial *b);
int main()
{
int Ka,Kb;
int cnt =0;
Polynomial *a,*b,*c,*la,*lb;
scanf("%d",&Ka); //输入a链表的长度
la=createPolynomial(a,Ka); //创建a链表储存a多项式
scanf("%d",&Kb); //输入b链表的长度
lb=createPolynomial(b,Kb); //创建b链表储存b多项式
c = plusPolynomial(la,lb); //将a,b多项式相加
Polynomial *p;
p=c->next; //p指向c链表第一个结点
while(p) //求链表a长度
{
cnt ++; //计数器
p = p->next; //a后移
}
p = c->next; //p指向c链表第一个结点
printf("%d",cnt); //输出长度
while(p) //循环输出结点
{
printf(" %d %.1f",p->exp,p->coe);
p = p->next;
}
return 0;
}
//后插法创建链表
Polynomial* createPolynomial(Polynomial *head,int K)
{
Polynomial *p,*q;
head = (Polynomial*)malloc(sizeof(Polynomial)); //创建头节点a
head->next = NULL; //开始链表只有一个头节点
q = head; //q指向头节点
int i;
for(i=0;i<K;i++) //循环插入节点
{
p = (Polynomial*)malloc(sizeof(Polynomial)); //创立一个p结点
double coefficients;
int exponents;
scanf("%d %lf",&exponents ,&coefficients); //输入系数和指数
p->exp = exponents; //存储指数
p->coe = coefficients; //存储系数
p->next = q->next; //将q指向的结点连接到p的后面
q->next = p;
q = p; //再将q指向p所在的结点
}
return head;
}
//求2个多项式相加组合到a
Polynomial* plusPolynomial(Polynomial *a,Polynomial *b)
{
Polynomial *la,*lb,*lc,*c;
c = (Polynomial*)malloc(sizeof(Polynomial)); //创建c链表
la = a->next; //la指向a链表第一个结点
lb = b->next; //lb指向b链表第一个结点
lc = c; //lc指向c头节点
while(la&&lb)
{
if(la->exp > lb->exp) //当la的指数大于lb时
{
//将la接到lc后面
lc->next = la;
lc = la;
la =la->next;
}
else if(la->exp == lb->exp) //当la的指数大于lb时
{
la->coe = la->coe + lb->coe; //系数求和
/*这里特别注意要考虑当2个系数相加为0时,那么就不能加到c中*/
if(la->coe!=0) //系数不为0时
{
Polynomial *p;
// la接到lc后面,la后移,lb后移,删除原来的lb结点
lc->next = la;
lc = la;
la = la->next;
p = lb;
lb = lb->next; //lb指针后移
free(p); //删除p结点
}
else
{
Polynomial *m,*n;
//la,lb都后移,删除la,lb原来所在的结点
m = la;
la = la->next;
lc->next = m ->next;
free(m);
n = lb;
lb = lb->next;
free(n);
}
}
else //当la<lb时
{
//将lb接到lc后面
lc->next = lb;
lc = lb;
lb =lb->next;
}
}
/*这里也要注意一下,前面的没有考虑当2条链表中的一条已经为空时,所以还需考虑这种情况*/
if(la)
{
lc->next = la;
}
if(lb)
{
lc->next = lb;
}
return c;
}
=====================================================================================================
坚持,继续修行