一元稀疏多项式计算器


一、系统描述

一元稀疏多项式计算系统:主要由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");
		}
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值