一、系统描述
一元稀疏多项式计算系统:主要由C语言链表完成,可以进行多项式的加法、减法、乘法、求值、求导运算。
若对一元多项式建立与输出以及加法还不了解的同学,可以去参考这篇 一元多项式加法(链表)之前所发的博客,里面有对链表构建一元多项式的详细介绍。本篇主要介绍多项式的减法及乘法部分思路(求值、求导较为简单)。
二、思路
减法: 将减数B多项式的所有系数变为其相反数,然后使用两个多项式相加的思想进行处理。
乘法: 多项式相加的PLUS版,需要使用A多项式中的每一项和B多项式中的每一项进行相乘,并将每次遍历完B后的结果依次放入长度为A的指针数组中,然后遍历指针数组进行多项式相加操作。
三、操作步骤
1)首先,用户输入A多项式内容(0结尾表示结束)
2)输入想要进行的运算所对应的选项
3)此处演示输入加法(按键1),并且输入B多项式内容,同样以0结尾
4)即可得到结果
5)用户可选择继续进行下一步运算,或者按6退出系统
四、测试用例
注意:本系统输入 x,y(x:系数;y:指数),0结尾表示此多项式输入结束。(测试用例中的分号表示换行符)
0. 清零(重新输入A多项式内容)
1. 加法:
输入:
A: 6,0 ; 2,1 ; 8,7 ; 4,15 ; 3,18 ; 0
B: 7,1 ; 2,6 ; - 8,7 ; 0
输出:
6+9X+2X^6 +4X^ 15+3X^18
2. 减法:
输入:
A: 6,0 ; 2,6 ; 8,7 ; 4,15 ; 0
B: 7,1 ; 2,6 ; - 8,7 ; 10,20 ; 16,30 ; 0
输出:
6-7X+16X^ 7+4X^ 15-10X^ 20-16X^30
3. 乘法:
输入:
A: 6,0 ; 2,6 ; 8,7 ; 0
B: 7,1 ; - 8,7 ; 0
输出:
42X-34X^ 7+56X^ 8-16X^ 13-64X^14
4. 求值:
输入:
A: 6,0 ; 2,3 ; 8,5 ; 7,10 ; 0
X: 2
输出:
7446.00
5. 求导:
输入:
A: 6,0 ; 2,1 ; 8,7 ; 4,15 ; 0
B: 7,1 ; 2,6 ; -8,7 ; 0
输出:
2+56X^ 6+60X^14
6. 退出系统
五、源代码
1. 定义结构体:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct poly {
int a;
int b;
struct poly* next;
}Poly;
2. 多项式建立:
Poly* creatPoly() {
int a, b;
Poly* head = (Poly*)malloc(sizeof(Poly));
Poly* cur = head;
cur->next = NULL;
scanf_s("%d, %d", &a, &b);
while (a)
{
Poly* new = (Poly*)malloc(sizeof(Poly));
new->a = a;
new->b = b;
new->next = cur->next;
cur->next = new;
cur = new;
scanf_s("%d, %d", &a, &b);
}
return head;
}
3. 多项式加法:
void printPoly(Poly* head) {
Poly* cur = head->next;
int flag = 0;
if (!cur)
printf("零多项式!!\n");
while (cur)
{
if (flag && cur->a > 0) {
printf("+");
}
if (cur->a != 1 && cur->a != -1) {
if (!cur->b) {
printf("%d", cur->a);
}
else if (cur->b == 1) {
printf("%dX", cur->a);
}
else {
printf("%dX^%d", cur->a, cur->b);
}
}
else if (cur->a == 1) {
if (!cur->b) {
printf("1");
}
else if (cur->b == 1) {
printf("X");
}
else {
printf("X^%d", cur->b);
}
}
else {
if (!cur->b) {
printf("-1");
}
else if (cur->b == 1) {
printf("-X");
}
else {
printf("-X^%d", cur->b);
}
}
flag++;
cur = cur->next;
}
printf("\n\n");
}
4. 多项式减法:
Poly* subPoly(Poly* A, Poly* B) {
Poly* curB = B->next;
while (curB)
{
curB->a *= -1;
curB = curB->next;
}
Poly* headC = addPoly(A, B);
return headC;
}
5. 多项式乘法:
Poly* multiPoly(Poly* A, Poly* B) {
int i = 0;
Poly* curA = A->next;
Poly* curB = B->next;
Poly* arr[1000];
if (!curA) {
return A;
}
else if (!curB) {
return B;
}
while (curA)
{
Poly* headC = (Poly*)malloc(sizeof(Poly));
Poly* curC = headC;
curC->next = NULL;
while (curB)
{
Poly* newC = (Poly*)malloc(sizeof(Poly));
newC->a = curA->a * curB->a;
newC->b = curA->b + curB->b;
newC->next = curC->next;
curC->next = newC;
curC = newC;
curB = curB->next;
}
arr[i++] = headC;
curA = curA->next;
curB = B->next;
}
for (int n = 0; n < i - 1; n++) {
arr[n + 1] = addPoly(arr[n], arr[n + 1]);
}
return arr[i - 1];
}
6. 多项式求值:
Poly* calcuPoly(Poly* head, int n) {
Poly* cur = head->next;
double sum = 0;
while (cur)
{
sum += cur->a * pow(n, cur->b);
cur = cur->next;
}
printf("%.2f\n\n", sum);
return head;
}
7. 多项式求导:
Poly* diffPoly(Poly* head) {
Poly* cur = head->next;
Poly* pre = head;
while (cur)
{
if (!cur->b) {
Poly* temp = cur;
pre->next = cur->next;
cur = pre->next;
free(temp);
}
else {
cur->a = cur->a * cur->b;
cur->b = cur->b - 1;
cur = cur->next;
}
}
return head;
}
8. 菜单页面:
void menu() {
printf("|=====【一元多项式计算系统】=====|\n");
printf("|--------------------------------|\n");
printf("| 0.清零 | 1.加法 |\n");
printf("|--------------------------------|\n");
printf("| 2.减法 | 3.乘法 |\n");
printf("|--------------------------------|\n");
printf("| 4.求值 | 5.求导 |\n");
printf("|--------------------------------|\n");
printf("| 6.退出 |\n");
printf("|================================|\n");
printf("\n");
}
9. 选项操作:
Poly* keyDown(Poly* A) {
int n;
Poly* C;
system("cls");
menu();
printf(">>>>>>>>>>>>请输入选项<<<<<<<<<<<<\n");
scanf_s("%d", &n);
switch (n)
{
case 0: {
return 0;
}
case 1: {
printf("请输入多项式B:\n");
Poly* B = creatPoly();
C = addPoly(A, B);
printf("多项式A与B相加得:\n");
printPoly(C);
return C;
}
case 2: {
printf("请输入多项式B:\n");
Poly* B = creatPoly();
printf("多项式A与B相减得:\n");
C = subPoly(A, B);
printPoly(C);
return C;
}
case 3: {
printf("请输入多项式B:\n");
Poly* B = creatPoly();
printf("多项式A与B相乘得:\n");
C = multiPoly(A, B);
printPoly(C);
return C;
}
case 4: {
int x;
printf("请输入X值:");
scanf_s("%d", &x);
printf("当X为 %d 时,多项式A值为:", x);
C = calcuPoly(A, x);
return C;
}
case 5: {
printf("多项式A求导得:\n");
C = diffPoly(A);
printPoly(C);
return C;
}
default: {
printf("退出系统!!\n");
exit(0);
}
}
}
10. 主函数:
void main() {
while (1)
{
menu();
printf("请输入多项式A:\n");
Poly* A = creatPoly();
while (1)
{
A = keyDown(A);
if (!A) {
system("cls");
break;
}
system("pause");
system("cls");
}
}
}