设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
AC代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 typedef struct _node{ //创建链表节点
4 int coef; //系数
5 int expon; //指数
6 struct _node *next;
7 }PolyNode,*Polynomial;
8
9 Polynomial Mult(Polynomial P1,Polynomial P2);
10 Polynomial Add(Polynomial P1,Polynomial P2);
11 void Attach(int c,int e,Polynomial *pRear);
12 void printPoly(Polynomial P);
13 Polynomial ReadPoly();
14
15 //自顶向下设计方案
16 int main(){
17 Polynomial P1,P2,PP,PS;
18 //读入多项式
19 P1 = ReadPoly();
20 P2 = ReadPoly();
21 //乘法运算并输出
22 PP = Mult(P1,P2);
23 printPoly(PP);
24 //加法运算并输出
25 PS = Add(P1,P2);
26 printf("
");
27 printPoly(PS);
28 return 0;
29 }
30
31 Polynomial ReadPoly(){
32 int c,e,N;
33 Polynomial Rear,P,t;
34 scanf("%d",&N);
35 P = (Polynomial)malloc(sizeof(PolyNode)); //通过建立头结点使得while语句不需要判断是否是第一次
36 Rear = P; //Rear表示最后一个节点
37 Rear->next = NULL;
38 while(N--){
39 scanf("%d %d",&c,&e);
40 Attach(c,e,&Rear);
41 }
42 t = P;
43 P = P->next;
44 free(t); //删除头节点
45 return P; //返回的链表不含头节点
46 }
47 void Attach(int c,int e,Polynomial *pRear){ //pRear是指针的指针
48 Polynomial P;
49 P = (Polynomial)malloc(sizeof( PolyNode));
50 P->coef = c;
51 P->expon = e;
52 P->next = NULL;
53 (*pRear)->next = P;
54 *pRear = P;
55 }
56 Polynomial Add(Polynomial P1,Polynomial P2){
57 Polynomial t1,t2,P,Rear,t;
58 t1 = P1;
59 t2 = P2;
60 P = (Polynomial)malloc(sizeof(PolyNode));
61 Rear = P;
62 P->next = NULL;
63 while(t1&&t2){
64 if(t1->expon > t2->expon){
65 Attach(t1->coef,t1->expon,&Rear);
66 t1 = t1->next;
67 }else if(t1->expon<t2->expon){
68 Attach(t2->coef,t2->expon,&Rear);
69 t2 = t2->next;
70 }else{
71 if((t1->coef)+(t2->coef)){ //相等时如果和为0不需要添加,不为0需要添加
72 Attach((t1->coef)+(t2->coef),t1->expon,&Rear);
73 t1 = t1->next;
74 t2 = t2->next;
75 }else{
76 t1 = t1->next;
77 t2 = t2->next;
78 }
79 }
80 }
81 while(t1){
82 Attach(t1->coef,t1->expon,&Rear);
83 t1 = t1->next;
84 }
85 while(t2){
86 Attach(t2->coef,t2->expon,&Rear);
87 t2 = t2->next;
88 }
89 t = P;
90 P = P->next;
91 free(t); //删除头节点
92 return P;
93 }
94
95 Polynomial Mult(Polynomial P1,Polynomial P2){ //插入法实现
96 Polynomial t1,t2,t,P,Rear;
97 int e,c;
98 P = (Polynomial)malloc(sizeof( PolyNode));
99 Rear = P;
100 P->next = NULL;
101 t1 = P1;
102 while(t1){
103 t2 = P2;
104 Rear = P;
105 while(t2){
106 e = t1->expon + t2->expon;
107 c = t1->coef * t2->coef;
108 while(Rear->next&&Rear->next->expon > e){ //搜索插入位置,不能用Attach
109 Rear = Rear->next;
110 }
111 if(Rear->next&&Rear->next->expon == e){ //相等时
112 if(Rear->next->coef + c){ //系数和不为0则加上
113 Rear->next->coef += c;
114 }
115 else{ //为0则删除该节点
116 t = Rear->next;
117 Rear->next = t->next;
118 free(t);
119 }
120 }else{ //不相等时
121 t = (Polynomial)malloc(sizeof( PolyNode));
122 t->coef = c;
123 t->expon = e;
124 t->next = Rear->next;
125 Rear->next = t;
126 Rear = Rear->next;
127 }
128 t2 = t2->next;
129 }
130 t1 = t1->next;
131 }
132 t = P;
133 P = P->next;
134 free(t); //删除头节点
135 return P;
136 }
137 void printPoly(Polynomial P){
138 if(!P){ //P不存在就输出“0 0”
139 printf("0 0");
140 return;
141 }
142 int flag = 1; //第一次输出与后来的区分以得到正确的格式要求
143 while(P){
144 if(flag ==1){
145 printf("%d %d",P->coef,P->expon);
146 flag = 0;
147 }else{
148 printf(" %d %d",P->coef,P->expon);
149 }
150 P = P->next;
151 }
152 }