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

输入格式:

输入分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;
struct PolyNode{
int coef;
int expon;
Polynomial link;
}; Polynomial ReadPoly(void); // 采用带头节点插入的方法建立多项式链表 先建立带头节点的链表读入多项式数据 最后删除头节点
Polynomial Mult(Polynomial P1,Polynomial P2);
Polynomial Add(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);
void Attach(int coef,int expon, Polynomial *pRear); //增加新节点到多项式链表后 pRear 指向链表最后节点地址的指针
void DeletePoly(Polynomial p); // 删除一个多项式链表 int main(){
Polynomial P1,P2,PP,PS; P1 = ReadPoly();
// PrintPoly(P1);
P2 = ReadPoly();
PP = Mult(P1,P2);
PrintPoly(PP);
PS = Add(P1,P2);
PrintPoly(PS); return 0;
} void Attach(int coef,int expon, Polynomial *pRear){
Polynomial p;
p = (Polynomial)malloc(sizeof(struct PolyNode));
p->coef = coef;
p->expon = expon;
p->link = NULL;
(*pRear)->link = p;
*pRear = p;
} Polynomial ReadPoly(void){
Polynomial P,Rear,t;
int n;
int coef,expon;
scanf("%d",&n);
P = (Polynomial)malloc(sizeof(struct PolyNode)); // 建立链表空的头节点
P->link = NULL;
Rear = P;
while (n--) {
scanf("%d %d",&coef,&expon);
Attach(coef,expon,&Rear);
}
t = P;
P = P->link;
free(t);
return P;
} void PrintPoly(Polynomial P){
int flag = 0;
if(P == NULL){
printf("0 0\n");
return;
}
// 最后一个没有空格 相当于除了开始,后面%d %d输出中间都有空格
while (P) {
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P = P->link;
}
printf("\n");
} Polynomial Add(Polynomial P1,Polynomial P2){
Polynomial t1 = P1,t2 = P2,t;
Polynomial p,rear;
p = (Polynomial)malloc(sizeof(struct PolyNode));
rear = p;
while (t1 && t2) {
if(t1->expon == t2->expon){
if(t1->coef + t2->coef){
Attach(t1->coef+t2->coef, t1->expon, &rear);
t1 = t1->link;
t2 = t2->link;
}else{
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;
}
t = p;
p = p->link;
free(t);
return p;
} // 多项式相乘算法:
// 第一个多项式第一项和第二个多项式所有项相乘得到结果多项式P
// 遍历第一个多项式其他元素和第二个多项式相乘一个一个元素插入到结果多项式P中
Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial P,Rear,t1,t2,t;
int coef,expon; if(!P1 || !P2) // 多项式为NULL 多项式输出 ceof expon为0
return NULL; t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2) {
Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while (t1) {
t2 = P2;
Rear = P;
while (t2) {
expon = t1->expon + t2->expon;
coef = t1->coef * t2->coef;
while (Rear->link && Rear->link->expon > expon) {
Rear = Rear->link;
}
if(Rear->link && Rear->link->expon == expon){
if(Rear->link->coef + coef){
Rear->link->coef = Rear->link->coef + coef;
}else{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}else{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->expon = expon;
t->coef = coef;
t->link = Rear->link;
Rear->link = t;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t = P;
P = P->link;
free(t);
return P;
}

PTA一元多项式的乘法与加法运算 另一种算法的更多相关文章

  1. PTA 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    原题地址 https://pta.patest.cn/pta/test/15/exam/4/question/710 5-2 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的 ...

  2. PTA数据结构 习题3.6 一元多项式的乘法与加法运算 (20分)

    一元多项式的乘法与加法运算 https://pintia.cn/problem-sets/434/problems/5865 设计函数分别求两个一元多项式的乘积与和. 时间限制:200 ms 内存限制 ...

  3. 线性结构2 一元多项式的乘法与加法运算 【STL】

    02-线性结构2 一元多项式的乘法与加法运算(20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和 ...

  4. PAT 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  5. 线性结构CT 02-线性结构1 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  6. 浙江大学PAT上机题解析之3-04. 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分 ...

  7. 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-04 设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行.每行分别先给出多项式非零项的个数.再以指数 ...

  8. 一元多项式的乘法与加法运算 【STL-map哈希-map反向迭代器遍历 + 零多项式】

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  9. 一元多项式的乘法与加法运算(C语言)

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

  10. 小白专场-多项式乘法与加法运算-c语言实现

    目录 一.题意理解 二.求解思路 三.多项式的表示 3.1 数组 3.2 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...

随机推荐

  1. linux查找服务位置

  2. linux 复合页( Compound Page )的介绍

    1.复合页的定义: 复合页(Compound Page)就是将物理上连续的两个或多个页看成一个独立的大页,它可以用来创建hugetlbfs中使用的大页(hugepage),  也可以用来创建透明大页( ...

  3. 通过抓取pintpoint2的页面信息把数据存入数据库python3

    目标:对生产环境的服务质量进行量化, 解决办法:把pintpoint2里的数据转存入mysql数据库,作成报表,目前支持总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务),其它指标可以 ...

  4. Redis缓存雪崩,击穿和穿透

    这三个问题的发生,会导致大量的请求直接积压到数据库,如果并发量很大,则可能会导致数据库宕机或故障. 缓存雪崩   描述:大量的请求无法在redis缓存中进行处理而被发送到数据库,导致数据库压力陡增. ...

  5. go语言web框架-如何使用gin教程+react实现web项目

    go-web+ react实践项目 前端使用react 搭建,从webpack搭建开始写,后端是学习go语言过程中的实践,由于之前没有实际的后端web经验,所以是自己一点一点摸索出来的.有错漏还望指正 ...

  6. centos7 yum安装配置Lnmp和负载配置

    首先配置防火墙CentOS 7.0默认使用的是firewall作为防火墙1.关闭firewall: systemctl stop firewalld.service #停止firewallsystem ...

  7. 解决Vue.js devtools插件成功装上,却在控制台中找不到的问题

    参考:https://blog.csdn.net/CCCCt1/article/details/97668483

  8. (转).Net Web开发技术栈

    作者:小曾出处:http://www.cnblogs.com/1996V/p/7700087.html 有很多朋友有的因为兴趣,有的因为生计而走向了.Net中,有很多朋友想学,但是又不知道怎么学,学什 ...

  9. idea var 总是有final

    转自:https://blog.csdn.net/Grantr/article/details/119184963 解决idea中快捷键ctrl+alt+v多生成的final ctrl+alt+v快捷 ...

  10. Docker容器 获取宿主机CPU信息等或重启网卡命令操作介绍

    一.作用场景及知识点 1. 使用场景(SSH方式除外): A. 运行在Docker容器里面的程序,怎么采集宿主机的CPU.内存.磁盘等信息: B. 容器内更改宿主机的网卡信息,怎么操作宿主机执行命令: ...