博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性结构CT 02-线性结构1 一元多项式的乘法与加法运算
阅读量:5080 次
发布时间:2019-06-12

本文共 4773 字,大约阅读时间需要 15 分钟。

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

输入格式:

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

输出格式:

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

输入样例:

4 3 4 -5 2  6 1  -2 03 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 15 20 -4 4 -5 2 9 1 -2 0
1 #include 
2 #include
3 typedef struct PolyNode *Polynomial; 4 struct PolyNode 5 { 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10 11 Polynomial ReadPoly(); 12 void Attach(int c,int e,Polynomial *pReal); 13 Polynomial Add(Polynomial P1,Polynomial P2); 14 Polynomial Mult(Polynomial P1,Polynomial P2); 15 void PrintPoly(Polynomial P); 16 17 int main() 18 { 19 Polynomial P1,P2,PMult,PSum; 20 P1 = ReadPoly(); 21 P2 = ReadPoly(); 22 PMult = Mult(P1,P2); 23 PrintPoly(PMult); 24 PSum = Add(P1,P2); 25 PrintPoly(PSum); 26 return 0; 27 } 28 Polynomial ReadPoly() 29 { 30 Polynomial P,Rear,t; 31 int c,e,N; 32 scanf("%d",&N); 33 P = (Polynomial)malloc(sizeof(struct PolyNode)); 34 P->next = NULL; 35 Rear = P; 36 while(N--){ 37 scanf("%d %d",&c,&e); 38 Attach(c,e,&Rear); 39 } 40 t = P; 41 P = P->next; 42 free(t); 43 return P; 44 } 45 void Attach(int c,int e,Polynomial *pReal) 46 { 47 Polynomial P; 48 P = (Polynomial)malloc(sizeof(struct PolyNode)); 49 P->coef = c; 50 P->expon = e; 51 P->next = NULL; 52 (*pReal)->next = P; 53 *pReal = P; 54 } 55 56 Polynomial Add(Polynomial P1,Polynomial P2) 57 { 58 Polynomial P,t1,t2,t,Rear; 59 if(!P1 && !P2){ 60 if(!P1) 61 return P2; 62 else 63 return P1; 64 } 65 P = (Polynomial)malloc(sizeof(struct PolyNode)); 66 P->next = NULL; 67 Rear = P; 68 t1 = P1; 69 t2 = P2; 70 while(t1 && t2){ 71 if(t1->expon == t2->expon){ 72 if(t1->coef + t2->coef) 73 Attach(t1->coef + t2->coef,t1->expon,&Rear); 74 t1 = t1->next; 75 t2 = t2->next; 76 } 77 else if(t1->expon > t2->expon){ 78 if(t1->coef) 79 Attach(t1->coef,t1->expon,&Rear); 80 t1 = t1->next; 81 } 82 else{ 83 if(t2->coef) 84 Attach(t2->coef,t2->expon,&Rear); 85 t2 = t2->next; 86 } 87 } 88 while(t1){ 89 if(t1->coef) 90 Attach(t1->coef,t1->expon,&Rear); 91 t1 = t1->next; 92 } 93 while(t2){ 94 if(t2->coef) 95 Attach(t2->coef,t2->expon,&Rear); 96 t2 = t2->next; 97 } 98 t = P; 99 P = P->next;100 free(t);101 return P;102 }103 Polynomial Mult(Polynomial P1,Polynomial P2)104 {105 Polynomial P,t1,t2,t,Rear;106 int c,e;107 if(!P1 || !P2)108 return NULL;109 t1 = P1;110 t2 = P2;111 P = (Polynomial)malloc(sizeof(struct PolyNode));112 P->next = NULL;113 Rear = P;114 while(t2){115 if(t1->coef * t2->coef){116 Attach(t1->coef * t2->coef,t1->expon + t2->expon,&Rear); 117 }118 t2 = t2->next;119 }120 t1 = t1->next;121 while(t1){122 t2 = P2;123 Rear = P;124 while(t2){125 e = t1->expon + t2->expon;126 c = t1->coef * t2->coef;127 while(Rear->next && Rear->next->expon > e)128 Rear = Rear->next;129 if(Rear->next && Rear->next->expon == e){130 if(Rear->next->coef + c)131 Rear->next->coef += c;132 else{133 t = Rear->next;134 Rear->next = t->next;135 free(t);136 }137 }138 else{139 if(c){140 t = (Polynomial)malloc(sizeof(struct PolyNode));141 t->coef = c;142 t->expon = e;143 t->next = Rear->next;144 Rear->next = t;145 Rear = Rear->next;146 }147 }148 t2 = t2->next;149 }150 t1 = t1->next;151 }152 t2 = P;153 P = P->next;154 free(t2);155 return P;156 }157 void PrintPoly(Polynomial P)158 {159 int flag = 0;160 if(!P)161 printf("0 0");162 while(P){163 if (!flag)164 flag = 1;165 else166 printf(" ");167 printf("%d %d", P->coef, P->expon);168 P = P->next;169 }170 printf("\n");171 }

需注意的点:需系数为0时的处理!

乘法运算实现方法即多项式逐项相乘的手算方法,将所得单项结果有序插入第一个多项式第一项与第二个多项式所得的多项式P中。

 

转载于:https://www.cnblogs.com/kuotian/p/4850564.html

你可能感兴趣的文章
Java程序IP v6与IP v4的设置
查看>>
RUP(Rational Unified Process),统一软件开发过程
查看>>
数据库链路创建方法
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
jQuery如何获得select选中的值?input单选radio选中的值
查看>>
设计模式 之 享元模式
查看>>
如何理解汉诺塔
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
15 FFT及其框图实现
查看>>
Linux基本操作
查看>>
osg ifc ifccolumn
查看>>
C++ STL partial_sort
查看>>
3.0.35 platform 设备资源和数据
查看>>
centos redis 安装过程,解决办法
查看>>
IOS小技巧整理
查看>>
WebDriverExtensionsByC#
查看>>