02-线性结构1 一元多项式的乘法与加法运算
2016-04-21 17:05
513 查看
02-线性结构1 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出
题目思路:何钦铭老师的小白专场
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
题目思路:何钦铭老师的小白专场
#include<stdio.h> #include <stdlib.h> typedef struct PolyNode *Polynomial;//注意结尾的“;” //指向结构体PolyNode的指针Polynomial struct PolyNode{ int coef;//多项式系数 int expon;//多项式指数 Polynomial link; }; Polynomial ReadPoly(); void Attach(int c, int e,Polynomial *pRear); Polynomial Add(Polynomial P1, Polynomial P2); Polynomial Mult(Polynomial P1,Polynomial P2); void PrintPoly(Polynomial P); int main() { Polynomial P1,P2,PP,PS; P1 = ReadPoly(); P2 = ReadPoly(); PP = Mult(P1,P2); PrintPoly(PP); PS = Add(P1,P2); PrintPoly(PS); return 0; } Polynomial ReadPoly() { Polynomial P,Rear,t; int c,e,N; scanf("%d",&N);//一共多少多项式 P = (Polynomial)malloc(sizeof(struct PolyNode));//链表头空节点 P->link = NULL; Rear = P; while(N--){ scanf("%d %d",&c,&e); Attach(c,e,&Rear);//将当前项加入多项式尾部 } t = P; P = P->link; free(t);//删除临时生成头节点 return P; } void Attach(int c, int e,Polynomial *pRear) { Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); P->coef = c;//对新节点赋值 P->expon = e; P->link = NULL; (*pRear)->link = P; *pRear = P;//修改Rear的值 ,移动Rear到当前项 } Polynomial Add(Polynomial P1, Polynomial P2) { Polynomial P,t1,t2,Rear,t;//P是表头节点,Rear是表尾节点 int sum; t1 = P1; t2 = P2; P = (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL; Rear = P; while(t1 && t2){ if(t1->expon == t2->expon){ sum = t1->coef + t2->coef; if(sum){ Attach(sum, t1->expon, &Rear); } t1 = t1->link; t2 = t2->link; } else if(t1->expon > t2->expon){ Attach(t1->coef, t1->expon, &Rear); t1 = t1->link; } else{ Attach(t2->coef, t2->expon, &Rear); t2 = t2->link; } } while(t1){ Attach(t1->coef, t1->expon, &Rear); t1 = t1->link; } while(t2){ Attach(t2->coef, t2->expon, &Rear); t2 = t2->link; } //Rear->link = NULL;//表结束了 t = P; P = P->link; free(t); return P; } Polynomial Mult(Polynomial P1,Polynomial P2) { Polynomial P,t1,t2,Rear,t; int c,e; if(!P1||!P2){ return NULL; } t1 = P1; t2 = P2; P = (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL; Rear = P; while(t2){//先用P1的第1项乘以P2,得到P Attach(t1->coef*t2->coef, t1->expon+t2->expon,&Rear); t2=t2->link; } t1=t1->link; while(t1){ t2 = P2; Rear = P; while(t2){ e = t1->expon + t2->expon; c = t1->coef * t2->coef; while(Rear->link && Rear->link->expon > e){ Rear = Rear->link; } if(Rear->link && Rear->link->expon == e){ if(Rear->link->coef + c){//若项数不为0 Rear->link->coef = Rear->link->coef + c; //项数相加 } else{//项数为0释放掉 t = Rear->link; Rear->link = t->link; free(t); } } else{ t = (Polynomial)malloc(sizeof(struct PolyNode)); t->coef = c; t->expon = e; t->link = Rear->link; Rear->link = t; Rear = Rear->link; } t2 = t2->link; } t1 = t1->link; } Rear->link = NULL;//表结束了 t2 = P; P = P->link; free(t2); return P; } void PrintPoly(Polynomial P) { //输出多项式 int flag = 0;//输出调整输出格式用 if(!P) { printf("0 0\n"); return; } while(P){ if(!flag){ flag = 1; } else{ printf(" "); } printf("%d %d", P->coef,P->expon); P = P->link; } printf("\n"); }
相关文章推荐
- 使用 redis 减少 秒杀库存 超卖思路
- 几种循环结构
- Asp.net面试题
- 画图2
- STM8学习笔记1
- i.MX283开发板格式化Flah与烧写过程
- 我是如何引导他做职业选择的?
- Android:消息处理机制(Handler,Message,Looper)分析
- Leetcode 第342题,判断一个数是否是4的幂数
- Selenium 学习资源
- poi架包
- Go语言中使用flag包对命令行进行参数解析的方法
- Android移动自动化中短信验证码解决方案
- sprintf sscanf用法
- Alamofire功能介绍
- 转载自 51Testing软件测试网 » 零测试 » 日志之Alpha测试/Beta测试/验收测试的区别
- 1*1 1的相乘
- 我们应当怎样学习HTML和CSS
- openresty 技能图谱
- 多位数乘一位数