编程题 02-线性结构2 一元多项式的乘法与加法运算【PAT】
文章目录
- 题目
- 输入格式
- 输出格式
- 输入样例
- 输出样例
- 题解
- 解题思路
- 完整代码
编程练习题目集目录
题目
设计函数分别求两个一元多项式的乘积与和。
输入格式
输入分 2 2 2 行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过 1000 1000 1000 的整数)。数字间以空格分隔。
输出格式
输出分 2 2 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 <iostream>
using namespace std;// 定义多项式项的结构
struct Node {int Term; // 系数int Expon; // 指数Node* Next; // 指向下一个节点的指针
};// 使用别名简化代码
using List = Node*;// 声明函数
List Read();
void Print(List L);
List Add(List L1, List L2);
List Multi(List L1, List L2);
List MultiByNode(List L1, Node L2);int main(void) {List L1, L2, LAdd, LMulti;L1 = Read();L2 = Read();LMulti = Multi(L1, L2);LAdd = Add(L1, L2);Print(LMulti);Print(LAdd);return 0;
}// 读取多项式
List Read() {List L, head;L = new Node;L->Next = nullptr;head = L;int n;cin >> n;if (n > 0) {for (int i = 0; i < n; i++) {List temp = new Node; // 创建新节点cin >> temp->Term >> temp->Expon; // 输入系数和指数temp->Next = nullptr; // 初始化新节点的Next指针L->Next = temp; // 将新节点链接到链表中L = temp; // 移动指针}}return head;
}// 打印多项式
void Print(List L) {List p = L->Next; // 跳过头节点if (!p) {cout << "0 0" << endl; // 如果多项式为空,输出0 0} else {while (p) {if (p->Next) {cout << p->Term << " " << p->Expon << " "; // 输出当前项,不换行} else {cout << p->Term << " " << p->Expon << endl; // 输出最后一项,换行}p = p->Next; // 移动到下一个节点}}
}// 多项式相加
List Add(List L1, List L2) {List L, head, t1, t2;L = new Node;L->Next = nullptr;head = L;t1 = L1->Next;t2 = L2->Next;while (t1 && t2) { // 遍历两个多项式List temp = new Node; // 创建新节点temp->Next = nullptr; // 初始化新节点的Next指针if (t1->Expon > t2->Expon) { // 比较指数temp->Term = t1->Term;temp->Expon = t1->Expon;L->Next = temp; // 将新节点链接到结果链表L = temp; // 移动指针t1 = t1->Next;} else if (t1->Expon < t2->Expon) {temp->Term = t2->Term;temp->Expon = t2->Expon;L->Next = temp;L = temp;t2 = t2->Next;} else if (t1->Expon == t2->Expon) { // 指数相等if ((t1->Term + t2->Term) == 0) { // 系数相加为0,抵消t1 = t1->Next;t2 = t2->Next;} else {temp->Term = t1->Term + t2->Term;temp->Expon = t1->Expon;L->Next = temp;L = temp;t1 = t1->Next;t2 = t2->Next;}}}// 将剩余的项直接链接到结果链表if (t1 == nullptr) {L->Next = t2;} else if (t2 == nullptr) {L->Next = t1;}return head;
}// 多项式相乘
List Multi(List L1, List L2) {List L, head, t1, t2, temp;L = new Node;L->Next = nullptr;head = L;t1 = L1->Next;t2 = L2->Next;if (t1 && t2) { // 如果两个多项式都不为空temp = MultiByNode(L1, *t2); // 逐项相乘t2 = t2->Next;while (t2) {List temp2 = MultiByNode(L1, *t2);temp = Add(temp, temp2); // 将结果相加t2 = t2->Next;}L->Next = temp->Next; // 链接最终结果}return head;
}// 单项与多项式相乘
List MultiByNode(List L1, Node L2) {List L, head, t1;L = new Node;L->Next = nullptr;head = L;t1 = L1->Next;while (t1) {List temp = new Node; // 创建新节点temp->Next = nullptr; // 初始化新节点的Next指针temp->Term = t1->Term * L2.Term; // 系数相乘temp->Expon = t1->Expon + L2.Expon; // 指数相加L->Next = temp; // 将新节点链接到结果链表L = temp; // 移动指针t1 = t1->Next;}return head;
}